在单个可执行文件中组合 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++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

如何仅部署单个可执行文件

一种发布 C++ 项目可执行文件的简洁方法

如何在 azure app 服务中使用 cl.exe 编译 c++ 代码并生成可执行文件

如何将资源嵌入到单个可执行文件中?

Java的特点之一——跨平台

c语言和c++和c#的区别