使用Fody.Costura将项目引用的dll文件合并入exe

2018年3月22日 3.07k 次阅读 0 条评论 1.78k 个文字

需求说明

做winform/wpf开发不可避免的是会引用很多第三方dll,可是每次打包的时候需要将Debug目录下的文件都拷贝给客户或者分享出去,这样用起来不是很方便。之前试过几种合并dll文件的软件,比如ILMerge、Enigma Virtual Box等,但直到我了解到Fody.Costura后,感觉世界都美好多了~

使用方法

操作步骤其实很简单,只需要两步即可大功告成。

  1. 打开项目解决方案,通过Nuget添加Costura.Fody。目前最新的版本为1.6.2。成功添加Costura.Fody后,解决方案会自动添加FodyWeavers.xml文件。
  2. 重新生成解决方案,就可以在程序生成目录看到你的成功啦,所有dll完美的合并入exe里啦,你可以直接拷贝exe文件到客户机独立运行了。

简单介绍

Costura.Fody是一款开源的工具,github地址:https://github.com/Fody/Costura。默认的配置已经能够满足我们的基本需要,但是Costura.Fody也提供了更多高级配置。这些配置均在CosturaFodyWeavers.xml文件里添加或修改。

CreateTemporaryAssemblies
默认值:false
这会在将内嵌文件加载到内存之前将其嵌入到磁盘中。这对于希望从物理文件加载程序集的某些场景很有用。

IncludeDebugSymbols
默认值:true
控制是否也嵌入了参考装配的.pdbs。

DisableCompression
默认值:false
嵌入式程序集默认是压缩的,加载时是未压缩的。您可以使用此选项关闭压缩。
注意:在引用一些非标准dll,或者经过加密处理的dll时候,一定要关闭这个属性。不然会导致打不开exe的情况。这个时在我使用DSkin.dll的时候发现的。

DisableCleanup
默认值:false
作为Costura的一部分,嵌入式组件不再包含在构建中。这个清理可以关闭。

LoadAtModuleInit
默认值:true
Costura默认会作为模块初始化的一部分加载。该标志禁用该行为。确保你可以在某个地方使用CosturaUtility.Initialize()。

ExcludeAssemblies
使用方法:ExcludeAssemblies="DLL1|DLL2"
要从“嵌入所有复制本地引用”的默认操作中排除的程序集名称列表。

IncludeAssemblies
使用方法:IncludeAssemblies="DLL1|DLL2"
从“嵌入所有复制本地引用”的默认操作中包含的程序集名称列表。

Unmanaged32Assemblies&Unmanaged64Assemblies
使用方法:Unmanaged32Assemblies="DLL1|DLL2" Unmanaged64Assemblies="DLL1|DLL2"
无法以与托管程序集相同的方式加载混合模式程序集。因此,为帮助Costura识别哪些组件是混合模式的,以及在哪些环境中加载它们,应在其中一个或两个列表中包含它们的名称。不要包含.exe或.dll在名称中。

PreloadOrder
使用方法:PreloadOrder="DLL1|DLL2"
本地库可以由Costura自动加载。要包含本地库,请将其作为嵌入式资源包含在您的项目中,称为文件夹costura32或costura64取决于库的不稳定性。或者,您也可以指定预加载库的加载顺序。从磁盘混合使用临时组件时,也会预装入组件。

CosturaUtility
使用方法:

class Program {
    static Program() {
        CosturaUtility.Initialize();
    }

    static void Main(string[] args) { ... }
}

CosturaUtility是一个让您可以在自己的代码中手动初始化Costura系统的类。这主要针对模块初始值设定程序不起作用的场景,例如库和Mono。

写在最后

总的来说这个工具还是非常好用的,上面的属性我时通过google翻译直接copy来的,可以参考参考。英语好点的可以直接看Costura.Fody官方文档

当你不够强大的时候,任何的赞美都是嘲讽

文章评论(0)