背景:我們的應用程序通常都是由多個程序集組成,例如一個 exe
程序依賴於多個 dll
程序集。在某些情況下,我們希望程序的分發能夠簡單,單獨一個 exe
就能正常運行。這種情況下,就需要將 dll
依賴項合並到 exe
主程序中。
本文章給大家講下非常好用的NuGet
包,Costura.Fody
1.第一步:通過 NuGet 安裝 Costura.Fody 和 Fody
Costura.Fody
是 Fody
中的工具(加載項)之一,通常情況下只需安裝前者即可,后者會自動安裝。
這這邊先添加一個Newtonsoft.Json的包做實驗,讓結果看到更明顯,后面有后面有生成前后的對比
第二步:添加 FodyWeavers.xml 文件
<?xml version="1.0" encoding="utf-8" ?> <Weavers> <Costura> <ExcludeAssemblies> Foo Bar </ExcludeAssemblies> </Costura> </Weavers>
第三步:編譯項目
編譯你的項目,看一下Debug輸出目錄,dll
是不是合並了
普通生成:
Costura.Fady生成:
從兩張圖片我們可以發現Newtonsoft的相關文件已經合並了,WindowsFormsApp1.exe的大小也發生了變化,從9KB變成了270KB
第四步:FodyWeavers.xml 文件的進階講解
1.ExcludeAssemblies
默認情況下,Costura.Fody
會將所有 Copy Local
的程序集進行合並。ExcludeAssemblies
用於指定不需要合並的程序集,注意文件名中不要后綴。
<Costura>
<ExcludeAssemblies>
Foo
Bar
</ExcludeAssemblies>
</Costura>
或者
<Costura ExcludeAssemblies='Foo|Bar' />
2.IncludeDebugSymbols
控制是否將程序集的相應 pdb
文件嵌入,默認值為 true
。
<Costura IncludeDebugSymbols='false' />
3.CreateTemporaryAssemblies
在程序運行時,將被嵌入的程序集生成到本地,默認值為 false
。如果該程序集的正常運行依賴於其物理地址,一定要啟用此功能。
<Costura CreateTemporaryAssemblies='true' />
4.DisableCleanup
默認情況下,被嵌入的程序集將從編譯的輸出目錄中清除,可通過該屬性來禁用清理。
<Costura DisableCleanup='true' />
5.非托管程序集的嵌入
<Costura Unmanaged32Assemblies='Foo32|Bar32' Unmanaged64Assemblies='Foo64|Bar64'/>
6.本地庫和預加載順序
<Costura PreloadOrder='Foo|Bar' />