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 类和结构公开?
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# 代码都可以调用该函数。开销有点愚蠢,但这在测试场景中应该无关紧要。