You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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),执行命令:
    ILMerge /target:winexe /out:YourFinalApp.exe YourOriginalApp.exe SydesoftDLL1.dll SydesoftDLL2.dll
    
    注意:WinForms/WPF应用必须加/target:winexe,控制台程序用/target:exe,把命令里的文件名换成你实际的EXE和DLL名称即可。
  • 执行后会生成一个合并后的EXE,直接分发这个文件就行。

方法2:嵌入资源+动态加载(通用所有.NET版本)

这个方法适配所有.NET版本,步骤如下:

  1. 把两个DLL文件添加到项目中,在Visual Studio里选中DLL,右键→属性,将生成操作改成嵌入的资源
  2. 在项目启动类(比如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」核对。
  3. 编译后生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:42:25