将C++ DLL打包进WinForm可执行文件中

本文最后更新于:2025年2月11日 晚上

在做C#开发时碰到了调用C++ DLL的需求,在C#中使用DLL并不复杂,但当时比较麻烦的需求是要将整个WinForm项目打包成一个可执行的exe文件。

首先,在.Net开发环境中,DLL有两种,分别是托管DLL和非托管DLL。我们可以简单理解为,托管DLL就是在.Net环境生成的DLL文件,而非托管DLL是不在.Net环境生成的DLL文件。更详细的区别可以看

ILMerge

ILMerge是巨硬官方推出的,用于在生成项目时合并DLL到exe的工具,但很可惜,他只支持合并托管的DLL。

当时我先编译出了一个非托管的DLL,发现存在上述问题。我又改写编译了一个托管版的,虽然能够直接通过添加引用导入该DLL,也能够在方法查看器中看到其中的所有方法,但ILMerge仍然认为这是一个非托管DLL。

我觉得ILMerge不怎么好用,于是便开始寻找其他工具。

Costura.Fody

GitHub地址

Nuget地址

在Nuget安装Costura.Fody后,Fody会做为依赖一同被添加进来,我在VS2015环境下,使用最新版本会遇到兼容性错误,所以使用旧版本VS需要手动降级。

安装完需要手动添加配置文件

image-20210821201251800

配置文件内容

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<Costura>
<IncludeAssemblies>
...(此处填入托管DLL,名称参考引用)
</IncludeAssemblies>
</Costura>
</Weavers>

非托管DLL需要放到固定名称的文件夹中,且32位与64位需要分别放置,Costura.Fody会自动将这两个文件夹中的内容合并到exe中。

image-20210821201616376


将C++ DLL打包进WinForm可执行文件中
https://jenscc.github.io/2021/08/21/C-与DLL/
作者
Jens
发布于
2021年8月21日
许可协议