✅ 推荐方案:使用 Costura.Fody
Costura 会自动把所有引用的 DLL 内嵌进你的 .exe
中(不依赖外部文件),构建完就是一个自包含的单文件 EXE,适合发布使用。
🧰 步骤详解
① 安装 NuGet 包(必须)
打开你的项目 → 右键 → 管理 NuGet 包 → 安装以下两个包:
Install-Package Fody
Install-Package Costura.Fody
② 确保项目中引用了目标 DLL(如 Fleck.dll
, Newtonsoft.Json.dll
)
-
你必须通过 "添加引用" → "浏览 DLL" 或 NuGet 安装方式让它们出现在
引用
中 -
确保它们属性里 Copy Local = true
③ 编辑你的 .csproj
(可选确认)
在 .csproj
文件中(右键项目 → 编辑项目文件)加入以下:
<Weavers>
<Costura />
</Weavers>
如果是使用 NuGet 自动安装,通常已经自动添加。
④ 构建你的项目(Release 模式)
构建后你会看到:
bin\Release\
│
├── YourApp.exe ✅ 单一文件,包含所有 DLL
├── *.pdb (调试用,可删)
└── 无需其他 DLL
你可以直接复制
.exe
给别人运行(前提是目标机器已装 .NET Framework 4.8)。
✅ Costura 支持的内容
类型 | 支持 |
---|---|
DLL 嵌入 | ✅ 所有托管 DLL(包括 Newtonsoft.Json, Fleck) |
子 DLL 调用反射 | ✅ 支持 |
非托管 DLL / .so |
⚠️ 默认不支持,要特殊处理 |
🔍 验证方法
你可以用解包工具(如 ILSpy )打开生成的 EXE,如果看到 .resources.dll
中包含了 Fleck
, Newtonsoft.Json
等说明嵌入成功。
🚫 替代方案(不推荐)
方法 | 原因 |
---|---|
ILMerge | 维护已停止,部分项目合并失败或有兼容性问题 |
手动加载资源 DLL | 可行但复杂,需写代码从资源中加载 DLL(AppDomain.CurrentDomain.AssemblyResolve ) |
✅ 总结
目标 | 方法 |
---|---|
.NET Framework 4.8 打包所有 DLL 到一个 .exe |
✅ Costura.Fody 最稳定、最简单 |
自动打包、支持反射、无需改代码 | ✅ 完全支持 |
在你的项目中已经正确引用了 Fody
和 Costura.Fody
,并且 .csproj
文件中也已经包含了 Costura.Fody.props
和 targets
的导入项:
<Import Project="..\packages\Costura.Fody.6.0.0\build\Costura.Fody.props" ... />
<Import Project="..\packages\Costura.Fody.6.0.0\build\Costura.Fody.targets" ... />
但还 缺少关键的配置文件 :FodyWeavers.xml
,这个文件就是告诉 Fody 使用哪些插件(例如 Costura
)来编织 IL。
✅ 正确做法:添加 FodyWeavers.xml
文件
在你的项目根目录(与 .csproj
同级)新建一个文件:
FodyWeavers.xml
内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<Costura />
</Weavers>
这个文件就是 Fody 的插件配置清单。
📁 文件结构应该是这样:
SedeiniEditor\
│
├── SedeiniEditor.csproj
├── FodyWeavers.xml 👈 你需要加这个文件
├── Program.cs
├── SedeIniEditForm.cs
└── ...
🧪 构建验证
你可以打开 bin\Release\
目录构建后的文件,应该看到:
-
SedeiniEditor.exe
✅ -
没有
Fleck.dll
/Newtonsoft.Json.dll
❌(说明已嵌入) -
如果你解压
.exe
或用 ILSpy 打开,会看到嵌入的资源里包含相关 DLL。
📌 可能问题排查
问题 | 原因 | 解决方案 |
---|---|---|
.exe 构建后仍依赖外部 DLL |
没有 FodyWeavers.xml | 添加此文件 |
提示无法找到 .targets 文件 |
没有还原 NuGet 包 | 点击"还原 NuGet 包"或 nuget restore |
报 MSBuild 不识别 <Weavers> |
误添加到 .csproj 而不是独立文件 |
不要添加 <Weavers> 到 .csproj ,它属于 FodyWeavers.xml |
✅ 总结
任务 | 操作 |
---|---|
启用 Costura 打包 DLL | 在项目目录添加 FodyWeavers.xml 文件 |
文件内容 | <Weavers><Costura /></Weavers> |
构建后生成单一 .exe |
自动完成,无需手动配置 |