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

26

为了获取更多知识,我将我的C++动态链接库转换成静态库。 我的问题是如何使用.obj文件在C# Express/MS Visual Studio中编译这两个项目?

5个回答

31

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


3
谢谢Jon。我必须使用一个DLL,但Jon Skeet不必这样,他可以编译任何东西。 - Ivan Prodanov
这应该可以通过运行时链接到静态库并以某种方式解释静态库的二进制文件来实现。我不懂C#,但我相信它可以读取二进制文件。 - user142019
@Radek:那么你打算如何运行代码呢?如果你愿意使用各种未经管理的函数,可能有一些方法可以做到这一点,但此时你几乎不再使用C#了。 - Jon Skeet
嵌入式虚拟机。另一种方法是在使用之前将其转换为DLL(可能需要重新组装、重新链接等),但这样它就不再是静态的了。虽然困难,但肯定是可行的。 - user142019
2
@Radek:我认为在大多数实际情况下,说“你做不到”是准确的。它需要达到什么程度才能让你接受“你做不到”——如果你必须构建自己的带有额外钩子的CLR,那算吗? - Jon Skeet
更新过时的答案。如果使用IL2CPP脚本后端而不是Mono,现在可以链接静态库,因为IL2CPP使用预编译,而Mono使用即时编译。 - Justin

19

在 C# 中“使用”静态库的方法是首先创建一个托管 C++ 包装器,为其它托管环境提供门面。正如其他人已经评论过的那样,C# 只支持 DLL 用于 P/Invoke。


1
这在概念上是有道理的,但假设静态库是第三方提供的,并且使用 /MTd 编译的,那么如何跨越到需要 /CLI 的 /MDd 领域呢? - Ternary

5
“静态库”意味着该库将与您的最终应用程序合并。这个概念在.NET中不存在,.NET只支持DLL文件。

1

无法这样做。

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


0
更新过时的答案。如果使用IL2CPP脚本后端而不是Mono,现在可以链接静态库,因为IL2CPP使用预编译,而Mono使用即时编译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接