例如,我想执行以下操作:
namespace Test
{
static bool PerformTest()
{
bool result = false;
// Todo: do something
return result;
}
}
..然后从另一个模块调用该函数:
Test::PerformTest();
..我收到一条错误消息,指出 PerformTest 不是命名空间的一部分。如果它是一个类,我会把它归结为缺少“公共(public)”声明,但据我所知,您只能公开引用类和结构吗?
最佳答案
static bool PerformTest()
static 关键字在不同的上下文中有不同的含义。在这里它的意思是“没有外部链接”,这与您想要的完全相反。您必须将其删除。
编译此代码时,/clr 是否生效尚不清楚。让我们假设它是。 CLR 不支持这样的自由函数,它只支持类方法。 C++/CLI 编译器通过创建一个名为 <Module>
的虚拟类来处理这个问题。在全局命名空间中,使自由函数成为该类的静态方法并且具有内部可访问性。类名和可访问性说明符都使其远离 C# 程序。反射应该有效,但我从未尝试过。
有一个后门,您可以像在 native DLL 项目中一样导出自由函数。相同的语法:
extern "C" __declspec(dllexport)
bool __stdcall PerformTest() {
// etc..
}
C++/CLI 编译器导出一个与任何 native 代码都可以调用的函数同名的 stub 。如果需要, stub 加载 CLR,切换到托管代码执行并调用实际的 PerformTest() 函数。任何 C# 代码现在都可以调用该函数。开销有点愚蠢,但在测试场景中应该无关紧要。
关于function - 是否可以在 C++/CLI 中声明/导出静态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8943090/