例如,我想做以下事情:
namespace Test
{
static bool PerformTest()
{
bool result = false;
// Todo: do something
return result;
}
}
..然后从另一个模块调用该函数:
Test::PerformTest();
..我收到一条错误消息,说PerformTest不是命名空间的一部分。如果是一堂课,我会把它归结为一个失踪的公众'声明,但据我所知,你只能将ref类和结构公开?
答案 0 :(得分:4)
static bool PerformTest()
static 关键字在不同的上下文中表示不同的内容。这意味着“没有外部联系”,它与你想要的完全相反。你必须删除它。
编译此代码时,/ clr是否生效尚不清楚。我们假设它是。 CLR不支持这样的自由函数,它只支持类方法。 C ++ / CLI编译器通过在全局命名空间中创建名为<Module>
的虚拟类来处理此问题,使自由函数成为该类的方法,该方法是静态的并且具有内部可访问性。类名和可访问性说明符都使它远离C#程序。反思应该有效,但我从未尝试过。
有一个后门,您可以像在原生DLL项目中一样导出自由功能。语法相同:
extern "C" __declspec(dllexport)
bool __stdcall PerformTest() {
// etc..
}
C ++ / CLI编译器导出一个存根,其名称与任何本机代码可以调用的函数相同。存根加载CLR,如果需要,切换到托管代码执行并调用实际的PerformTest()函数。任何C#代码现在都可以调用该函数。开销有点傻,但在测试场景中这应该不重要。
答案 1 :(得分:1)
C#不允许在命名空间级别使用静态函数,而是必须将它们放在类
中C#代码
namespace CLITest
{
public static class Test
{
public static bool PerformTest()
{
bool result = false;
// Todo: do something
return result;
}
}
}
C ++ / CLI代码
using namespace CLITest;
int main()
{
Test::PerformTest();
return 0;
}
会做你想做的事