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

升级RestSharp至110.2.0后,如何将依赖DLL嵌入自定义DUEDLL?

实现依赖DLL嵌入到DUEDLL的几种方案

针对你升级RestSharp后产生的多依赖DLL分发问题,以下几种方案可以将这些依赖嵌入到你的DUEDLL中,无需单独复制:

方案1:使用Costura.Fody(推荐,最简单)

Costura.Fody是一个Fody插件,能自动将项目依赖的DLL嵌入到主程序集里,编译后直接生成包含所有依赖的单个DLL。

步骤:

  • 在Visual Studio中,右键你的DUEDLL项目 → 管理NuGet程序包,搜索并安装Costura.Fody(无需单独安装Fody主包,Costura会自动处理依赖)
  • 安装完成后无需额外配置,直接编译项目。编译后的DUEDLL会自动包含所有依赖的DLL,分发时只需要这个单个文件即可。

如果需要排除某些不需要嵌入的依赖(比如ComunicaDLL),可以在项目根目录添加FodyWeavers.xml文件,配置排除规则:

<Weavers>
  <Costura>
    <ExcludeAssemblies>
      ComunicaDLL
    </ExcludeAssemblies>
  </Costura>
</Weavers>

方案2:使用ILMerge

ILMerge是微软官方的程序集合并工具,可以将多个.NET程序集合并成一个。

步骤:

  1. 安装ILMerge NuGet包:在NuGet包管理器中搜索并安装ILMerge
  2. 配置项目的Post-build事件:
    右键项目 → 属性 → 生成事件 → 后期生成事件命令行,添加以下命令(替换所有依赖DLL名称,注意ILMerge路径随版本可能变化):
    "$(SolutionDir)packages\ILMerge.3.0.41\tools\net472\ILMerge.exe" /out:"$(TargetDir)DUEDLL_Merged.dll" "$(TargetPath)" "$(TargetDir)Microsoft.Bcl.AsyncInterfaces.dll" "$(TargetDir)System.Text.Encodings.Web.dll" "$(TargetDir)System.Buffers.dll" "$(TargetDir)System.Memory.dll" "$(TargetDir)System.Numeric.Vectors.dll" "$(TargetDir)System.Runtime.CompilerServices.Unsafe.dll" "$(TargetDir)System.Threading.Tasks.Extensions.dll" "$(TargetDir)System.ValueTuple.dll"
    
  3. 编译项目后,输出目录会生成DUEDLL_Merged.dll,这个就是合并了所有依赖的程序集。

注意事项

  • 如果你的DUEDLL是强命名的,合并后需要重新签名,可在ILMerge命令中添加/keyfile:"你的强签名密钥文件路径.snk"参数。

方案3:手动嵌入资源并动态加载

如果不想使用第三方工具,可以手动将依赖DLL作为嵌入资源,在程序运行时动态加载。

步骤:

  1. 将所有依赖DLL添加到项目:右键项目 → 添加 → 现有项,选中所有依赖DLL;然后在每个DLL的属性中,设置“生成操作”为嵌入的资源,“复制到输出目录”为不复制。
  2. 在DUEDLL项目中添加静态构造函数,注册程序集解析事件:
    using System;
    using System.Reflection;
    
    namespace YourDUEDLLNamespace
    {
        public class YourCoreClass
        {
            static YourCoreClass()
            {
                AppDomain.CurrentDomain.AssemblyResolve += ResolveEmbeddedAssembly;
            }
    
            private static Assembly ResolveEmbeddedAssembly(object sender, ResolveEventArgs args)
            {
                var assemblyName = new AssemblyName(args.Name).Name;
                // 资源名称格式:项目命名空间.依赖DLL名称.dll,需和实际命名空间匹配
                var resourcePath = $"YourDUEDLLNamespace.{assemblyName}.dll";
    
                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourcePath))
                {
                    if (stream == null) return null;
    
                    var assemblyBytes = new byte[stream.Length];
                    stream.Read(assemblyBytes, 0, assemblyBytes.Length);
                    return Assembly.Load(assemblyBytes);
                }
            }
        }
    }
    
  3. 编译项目后,生成的DUEDLL会包含所有依赖DLL的嵌入资源,运行时会自动加载这些依赖。

注意事项

  • 可通过Assembly.GetExecutingAssembly().GetManifestResourceNames()方法查看所有嵌入的资源名称,确保代码中的路径正确。

内容的提问来源于stack exchange,提问作者GWeber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:18:19