用于 C++ 的 C# 包装器,但仅编译为静态库

Posted

技术标签:

【中文标题】用于 C++ 的 C# 包装器,但仅编译为静态库【英文标题】:C# Wrapper for C++ but compiles as static library only 【发布时间】:2013-04-08 15:29:10 【问题描述】:

我正在尝试通过编写包装器从 C# 运行非托管本机 C++ 类代码。我的 C++ 代码可以毫无问题地编译为静态库 (.lib)。该代码依赖于其他代码,我相信这些代码都被编译为静态库。由于存在链接器错误,我无法将其编译为 DLL。

我刚刚了解到需要将包装器编译为 DLL,以便可以从 C# 调用它。这是真的?我可以不将我的包装器编译为要在 C# 中使用的静态库吗?

【问题讨论】:

听起来你指的是P/Invoke。据我所知,这仅适用于 DLL。如何创建包含本机 C++ 的托管 C++ DLL?这将允许直接在您的 C# 项目中添加引用并访问您的托管 C++ 类。 我会采纳您的建议来创建托管 C++ DLL。您是否有一个很好的教程来解释如何将非托管转换为托管? 我曾经为 html Tidy 创建了一个托管 C++ DLL。 Here is my Code Project article,或许对你有帮助。 另外,我的大部分依赖项都编译为静态库 - 要创建托管 C++ DLL,是否需要将依赖项重新编译为 DLL? 【参考方案1】:

C# 无法加载 .lib 文件。

P/Invoke 只能加载 .DLL 文件(它们不必命名为 .DLL,但必须是正确的文件格式)。

【讨论】:

以上是关于用于 C++ 的 C# 包装器,但仅编译为静态库的主要内容,如果未能解决你的问题,请参考以下文章

如何附加调试器以从托管(C#)包装器进入本机(C++)代码?

使用静态包装器直接调用无处不在的接口包装类时的快捷方式和建议?

从非托管 c++ 调用 C# 函数(通过托管包装器)

C++ 静态多数组包装器

序列化具有嵌入类的boost类,但仅对包装器中的信息进行序列化

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