如何将NFC-ACR122U NuGet包的DLL嵌入C# .NET程序的EXE中?
在C# .NET中将第三方DLL嵌入EXE的解决方案
针对你遇到的Sydesoft NFC-ACR122U相关DLL无法随EXE分发的问题,有几种靠谱的方法可以把DLL嵌入到EXE里,只发单个文件就行:
方法1:用ILMerge合并(适合.NET Framework)
ILMerge是专门用来合并.NET程序集的工具,操作直接:
- 先通过NuGet安装
ILMerge包 - 编译完项目后,打开命令行切换到输出目录(比如
bin/Release),执行命令:
注意:WinForms/WPF应用必须加ILMerge /target:winexe /out:YourFinalApp.exe YourOriginalApp.exe SydesoftDLL1.dll SydesoftDLL2.dll/target:winexe,控制台程序用/target:exe,把命令里的文件名换成你实际的EXE和DLL名称即可。 - 执行后会生成一个合并后的EXE,直接分发这个文件就行。
方法2:嵌入资源+动态加载(通用所有.NET版本)
这个方法适配所有.NET版本,步骤如下:
- 把两个DLL文件添加到项目中,在Visual Studio里选中DLL,右键→属性,将生成操作改成
嵌入的资源 - 在项目启动类(比如
Program.cs)中添加程序集解析代码:
重点:要确认嵌入资源的完整名称是using System; using System.Reflection; // WinForms项目需额外添加using System.Windows.Forms; namespace YourAppNamespace { class Program { static void Main(string[] args) { // 注册解析事件,找不到DLL时自动从嵌入资源读取 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; // 保留原有启动逻辑,比如WinForms的Application.Run(new MainForm()); } private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { // 提取目标DLL名称 var assemblyName = new AssemblyName(args.Name).Name + ".dll"; // 从嵌入资源读取DLL流,注意替换成你项目的实际命名空间 using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"YourAppNamespace.{assemblyName}"); if (stream == null) return null; byte[] assemblyBytes = new byte[stream.Length]; stream.Read(assemblyBytes, 0, assemblyBytes.Length); return Assembly.Load(assemblyBytes); } } }你的项目命名空间.DLL文件名,可在VS中查看DLL属性的「资源ID」核对。 - 编译后生成的EXE已包含两个DLL,直接分发即可。
方法3:.NET Core/.NET 5+的单文件发布(最省心)
如果你的项目是.NET Core 3.0及以上版本,直接用官方单文件发布功能:
- 右键项目→属性→发布,选择目标平台(比如Windows x64),勾选生成单个文件;若不想让用户安装.NET,可勾选独立发布(会打包运行时,文件体积更大)
- 也可直接修改项目
.csproj文件,添加配置:<PropertyGroup> <PublishSingleFile>true</PublishSingleFile> <SelfContained>true</SelfContained> <!-- 无需用户装.NET则设为true,否则为false --> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- 按需替换为win-x86、win-arm64等 --> </PropertyGroup> - 发布后会得到单个EXE,所有依赖DLL都已打包在内。
注意点
- 如果Sydesoft的DLL是原生非托管DLL,动态加载方法可能失效,优先选择ILMerge或单文件发布
- 单文件发布的独立模式虽体积大,但目标机器无需预装.NET环境
内容的提问来源于stack exchange,提问作者user20202784
相关产品推荐
相关产品推荐

