如何创建包含所有依赖项的DLL?解决类库编译依赖缺失问题
嘿,这个问题我太熟了!你碰到的是类库开发里常见的「依赖缺失」坑——你常规编译出来的DLL只包含自己写的代码,而你通过NuGet引用的S22.Imap并没有被打包进去,到了没有安装这个NuGet包的电脑上,自然就找不到相关函数了。
下面给你两种靠谱的解决方案,都是实际开发中常用的:
方法一:用Costura.Fody(最简单,新手推荐)
这是一个NuGet包,能自动把所有依赖内嵌到你的主DLL里,全程零代码操作:
- 打开你的类库项目,右键点击「管理NuGet程序包」
- 在「浏览」标签里搜索
Costura.Fody,找到后安装对应你项目.NET版本的包 - 安装完成后,啥额外配置都不用做,直接重新编译你的项目
- 此时生成的DLL已经把S22.Imap(包括它可能有的嵌套依赖)全部内嵌进去了,拿到其他电脑上直接用就行,不用附带任何额外文件
方法二:用ILMerge(手动合并,适合需要精细控制的场景)
如果你想自己掌控合并过程,可以用ILMerge这个官方工具:
- 先获取ILMerge:可以通过NuGet安装
ILMerge包,或者下载官方发布的工具 - 编译你的类库项目,找到输出的自定义DLL(比如叫
MyImapTool.dll),再找到NuGet包目录里的S22.Imap.dll,把它们放到同一个文件夹里 - 打开命令提示符(CMD)或者PowerShell,切换到这个文件夹,执行以下命令:
ILMerge.exe /out:MergedImapTool.dll MyImapTool.dll S22.Imap.dll
- 说明:
/out用来指定合并后生成的DLL名称,后面依次是你的主DLL和需要合并的依赖DLL
- 执行完命令,你就能得到一个包含所有代码的
MergedImapTool.dll,拿去其他电脑使用就不会出现找不到函数的问题了
额外注意事项
- 如果S22.Imap还依赖其他DLL,Costura.Fody会自动识别并全部内嵌;ILMerge则需要把所有依赖DLL都加到命令行参数里
- 要是依赖的是带有非托管代码的DLL(比如C++写的原生库),这两种方法可能都不适用,但S22.Imap是纯托管DLL,完全没问题
内容的提问来源于stack exchange,提问作者Carmen Cisterna Chamblas
相关产品推荐
相关产品推荐

