从 C# 访问 C++ 静态方法

Posted

技术标签:

【中文标题】从 C# 访问 C++ 静态方法【英文标题】:Access C++ static methods from C# 【发布时间】:2017-02-23 08:58:11 【问题描述】:

假设你有以下 C++ 代码:

extern "C" 
    void testA(int a, float b) 
    

    static void testB(int a, float b)
    

我想在我的 C# 项目中使用 DllImport 访问它:

class PlatformInvokeTest

    [DllImport("test.so")]
    public static extern void testA(int a, float b);
    [DllImport("test.so")]
    internal static extern void testB(int a, float b);

    public static void Main() 
    
        testA(0, 1.0f);
        testB(0, 1.0f);
    

这对testA 非常有效,但testB 无法抛出EntryPointNotFoundException。

我可以从我的 C# 代码访问testB 吗?怎么样?

【问题讨论】:

在全局范围内声明为 static 的函数没有外部链接,因此永远无法导出。你必须去除静电。您可能会将其与声明类成员函数混淆,将其声明为静态会做一些非常不同的事情。 【参考方案1】:

static 在 C++ 中的含义与在 C# 中的含义不同。在命名空间范围内,static 给出了一个名称内部链接,这意味着它只能在包含定义的翻译单元内访问。没有静态,它有外部链接,并且可以在任何翻译单元中访问。

当你想使用DllImport时,你需要删除static关键字

【讨论】:

以上是关于从 C# 访问 C++ 静态方法的主要内容,如果未能解决你的问题,请参考以下文章

C#如何静态调用C++中的方法(静态调用dll)

从 C# 调用 C++ dll 方法/类

访问静态变量 C# [重复]

如何使用 C++ 静态库编译 C# 应用程序?

C# 静态成员和方法的学习小结

为啥 C# 公共静态变量不需要实例化?