背景:我們的應用程式通常都是由多個程式集組成,例如一個 exe 程式依賴於多個 dll 程式集。在某些情況下,我們希望程式的分發能夠簡單,單獨一個 exe 就能正常運行。這種情況下,就需要將 dll 依賴項合併到 exe 主程式中。 本文章給大家講下非常好用的NuGet 包,Costura.Fody ...
背景:我們的應用程式通常都是由多個程式集組成,例如一個 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' />