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

时间:2012-01-20 14:42:22

标签: function static c++-cli

例如,我想做以下事情:

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

        // Todo: do something

        return result;
    }
}

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

Test::PerformTest();

..我收到一条错误消息,说PerformTest不是命名空间的一部分。如果是一堂课,我会把它归结为一个失踪的公众'声明,但据我所知,你只能将ref类和结构公开?

2 个答案:

答案 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;
}

会做你想做的事