升级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程序集合并成一个。
步骤:
- 安装ILMerge NuGet包:在NuGet包管理器中搜索并安装
ILMerge - 配置项目的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" - 编译项目后,输出目录会生成
DUEDLL_Merged.dll,这个就是合并了所有依赖的程序集。
注意事项
- 如果你的DUEDLL是强命名的,合并后需要重新签名,可在ILMerge命令中添加
/keyfile:"你的强签名密钥文件路径.snk"参数。
方案3:手动嵌入资源并动态加载
如果不想使用第三方工具,可以手动将依赖DLL作为嵌入资源,在程序运行时动态加载。
步骤:
- 将所有依赖DLL添加到项目:右键项目 → 添加 → 现有项,选中所有依赖DLL;然后在每个DLL的属性中,设置“生成操作”为嵌入的资源,“复制到输出目录”为不复制。
- 在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); } } } } - 编译项目后,生成的DUEDLL会包含所有依赖DLL的嵌入资源,运行时会自动加载这些依赖。
注意事项
- 可通过
Assembly.GetExecutingAssembly().GetManifestResourceNames()方法查看所有嵌入的资源名称,确保代码中的路径正确。
内容的提问来源于stack exchange,提问作者GWeber
相关产品推荐
相关产品推荐

