从 c# 访问 C++ .lib 库

Posted

技术标签:

【中文标题】从 c# 访问 C++ .lib 库【英文标题】:Accessing a C++ .lib library from c# 【发布时间】:2011-05-06 18:54:13 【问题描述】:

我有一个 c++ 库文件 (.lib)。如何从 C# 访问其中的函数?我读过我可以将库文件包装在 c++ dll 中并以这种方式公开函数。这是唯一的方法吗?我不是代码的所有者,所以我的选择有限。

【问题讨论】:

【参考方案1】:

使用 C++/CLI 程序集包装 C++ 库。

C++/CLI 允许您混合托管和非托管代码,充当 C# 和本机 C++ 之间的桥梁。它实际上非常简单且相对容易做到,尽管如果你有很多类/函数要包装,它会变得乏味。

Here 就是一个例子。

【讨论】:

谢谢。这是我将使用的方法,因为我无法修改原始 c++ 库。【参考方案2】:

您不能直接访问 c++ 库文件 (.lib)。最好的方法是在非托管代码周围使用非托管包装器。参考DllImportAttribute

在 MSDN 帮助文档中有一个很好的用法示例:

using System;
using System.Runtime.InteropServices;

class Example

    // Use DllImport to import the Win32 MessageBox function.
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    
        // Call the MessageBox function using platform invoke.
        MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
    


另请注意:您可以在 c++ 库周围使用托管 c++ 包装器,但最好在非托管 c++ 代码中编写包装器。

【讨论】:

DllImport 可以导入 *.lib 吗?我不知道:) 是的,我的回答有点草率。我读了 c++ 并立即认为他的意思是编译的程序集。我错过了 .lib 部分,因为有些人使用术语库类似于汇编。

以上是关于从 c# 访问 C++ .lib 库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 应用程序中使用 C++ 库?

用于在 C++ 中抽象数据库访问的开源库?

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

c++ lib dll 的 C# 包装类

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

使用 COM 接口 C# 从 c++ 访问会产生错误