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

Posted

技术标签:

【中文标题】如何使用 C++ 静态库编译 C# 应用程序?【英文标题】:How to compile C# application with C++ static library? 【发布时间】:2009-04-08 11:22:03 【问题描述】:

我把我的 C++ 动态链接库变成了静态库只是为了获得更多的知识。 我的问题是如何使用 .obj 文件通过 C# express/MS Visual Studio 编译这两个项目?

【问题讨论】:

【参考方案1】:

不,您不能直接从 C# 访问静态库。您必须使用 DLL。

【讨论】:

我必须使用 DLL,但 Jon Skeet 不必这样做,他可以编译任何东西。 :) 谢谢乔恩。 这必须通过运行时链接到静态库并以某种方式解释静态库的二进制文件来实现。我不懂 C#,但我很确定可以用它读取二进制文件。 @Radek:您打算如何运行代码?如果您愿意使用各种非托管函数,可能有办法做到这一点,但此时您几乎不再使用 C#。 嵌入式虚拟机。另一种方法是在使用它之前将其转换为 DLL(可能通过重新组装、重新链接等),但它确实不再是静态的了。这很困难,但肯定是可能的。 @Radek:我认为出于最实际的目的,说“你做不到”是准确的。在你接受“你做不到”之前,你还需要走多远——如果你必须用额外的钩子构建自己的 CLR,这算数吗?【参考方案2】:

在 C# 中“使用”静态库的方法是首先创建一个托管 C++ 包装器,该包装器将为托管世界的其余部分提供外观。正如其他人已经评论的那样,C# 仅支持 P/Invoke 的 DLL。

【讨论】:

从概念上讲这是有道理的,但假设静态库是第三方并使用 /MTd 编译的,你如何进入 /CLI 所需的 /MDd 土地?【参考方案3】:

“静态库”表示该库将与您的最终应用程序合并。这个概念在.net 中不存在。 .net 仅支持 DLL。

【讨论】:

【参考方案4】:

没办法。

仅在运行时调用 DLL 函数或从您的库中创建 COM 对象

【讨论】:

以上是关于如何使用 C++ 静态库编译 C# 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

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

在 C# 应用程序中构建静态库

构建 R 包时如何链接静态库

如何将托管 c++ 库导入 C# 应用程序(目标 .net 版本 3.5)

Metro 应用程序中 C++ 和 C# 之间的通信

如何使用 C# 编译 C++ 代码。需要开发 C++ IDE [关闭]