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

标签 function static c++-cli

例如,我想执行以下操作:

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/

相关文章:

c# - 属性与 get 之间的区别;放;没有得到;放;

c# - 无法从 C# 访问的 C++ 包装方法

.net - 捕捉到基于十六进制的网格中最近的六边形中心

c++ - 在 CLI/C++ 中限制 API 调用的运行时间

无法使用数组创建 C 函数

c++ - 在头文件中执行 const std::string 的正确方法?

python - 在 Python 中查找字符串中最长运行的从零开始的索引的函数

c++ - std::thread::hardware_concurrency 和静态初始化

python - 如何编写一个像 list(zip(...)) 一样工作的函数?

c - 当输入无效时如何递归要求输入?