在单个可执行文件中组合 C# 和 C++ 代码
Posted
技术标签:
【中文标题】在单个可执行文件中组合 C# 和 C++ 代码【英文标题】:Combining C# and C++ Code in a single Executable 【发布时间】:2014-05-25 06:22:23 【问题描述】:我如何在单个可执行文件中编写 C# 和 C++ 代码,最终的 Exe 是否需要 Net Framework。 我正在使用 Visual Studio 2013。
【问题讨论】:
你不能在同一个可执行文件中轻松地做到这一点。但是,编写主要 C# 可执行文件使用的 C++/CLI 类库(.DLL 程序集)很简单。 查看这个 Stack Overflow 帖子***.com/questions/935664/… 【参考方案1】:来自here
如果您的 C++ 代码未使用 /clr:safe 编译(即使用 /clr 或 /clr:pure 编译),请执行以下操作:
-
将 C++ 代码编译成 .obj 文件
将 C# 代码编译成 .net 模块,使用 /AddModule 来引用 C++ .obj 文件
使用 C++ 链接器将 C# .net 模块与 C++ 目标文件直接链接,以创建混合语言程序集
如果您的 C++ 代码是使用 /clr:safe 编译的,请将您的 C++ 代码构建为 .net 模块。您可以像使用任何其他语言的 .netmodule 一样使用它。
Here is a sample.
Here in great detail
【讨论】:
@NirMH,我猜第一个链接考虑了这两种情况。【参考方案2】:适用于任何托管程序集(用 C++/CLI 或任何 .Net 语言编写)的另一种方法是将该程序集作为资源添加到您的可执行项目中。因此,如果该程序集没有出现在您的 exe 目录中,它将使用以下代码从资源中加载。
在你的 exe 中,你应该注册到程序集解析事件:
AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
Assembly asm = null;
if (e.Name == "otherAssembly.dll")
byte[] assemblyBytes = // code to retrieve assembly from resources.
asm = Assembly.Load(assemblyBytes);
return asm;
;
【讨论】:
以上是关于在单个可执行文件中组合 C# 和 C++ 代码的主要内容,如果未能解决你的问题,请参考以下文章