是否可以在 C++/CLI 中声明/导出静态函数?

Jon*_*age 0 static c++-cli function

例如,我想做以下事情:

namespace Test
{
    static bool PerformTest()
    {
        bool result = false;

        // Todo: do something

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

..然后从另一个模块调用该函数:

Test::PerformTest();
Run Code Online (Sandbox Code Playgroud)

..我收到一条错误消息,指出 PerformTest 不是命名空间的一部分。如果它是一个类,我会将其归结为缺少“公共”语句,但据我所知,您只能将 ref 类和结构公开?

Han*_*ant 5

static bool PerformTest()
Run Code Online (Sandbox Code Playgroud)

静态关键字手段在不同环境下不同的事情。这里的意思是“没有外部链接”,这与您想要的完全相反。您必须将其删除。

尚不清楚 /clr 在编译此代码时是否有效。让我们假设它是。CLR 不支持这样的自由函数,它只支持类方法。C++/CLI 编译器通过创建一个<Module>在全局命名空间中命名的虚拟类来处理这个问题,使自由函数成为该类的静态方法并具有内部可访问性。类名和可访问性说明符都使其远离 C# 程序。反射应该有效,但我从未尝试过。

有一个后门,您可以像在本机 DLL 项目中一样导出自由函数。相同的语法:

extern "C" __declspec(dllexport) 
bool __stdcall PerformTest() { 
    // etc.. 
}
Run Code Online (Sandbox Code Playgroud)

C++/CLI 编译器导出一个与任何本机代码都可以调用的函数同名的存根。如果需要,存根加载 CLR,切换到托管代码执行并调用实际的 PerformTest() 函数。现在,任何 C# 代码都可以调用该函数。开销有点愚蠢,但这在测试场景中应该无关紧要。