.NET 合併程式集(將 dll 合併到 exe 中)
阿新 • • 發佈:2018-12-05
.NET 合併程式集(將 dll 合併到 exe 中)
我們的應用程式通常都是由多個程式集組成,例如一個 exe
程式依賴於多個 dll
程式集。在某些情況下,我們希望程式的分發能夠簡單,單獨一個 exe
就能正常執行。這種情況下,就需要將 dll
依賴項合併到 exe
主程式中。
本文將給大家介紹一款能將 .NET
程式集進行合併的工具 Costura.Fody
,它是一個 NuGet
包,能在程式編譯時將其依賴項作為資源嵌入到主程式中。本文主要介紹使用方法,關於它的實現原理,可以參考:
- Jeffrey Richter’s suggestion of using embedded resources as a method of merging assemblies
- Einar Egilsson’s suggestion using cecil to create module initializers
使用方法
第一步:通過 NuGet 安裝 Costura.Fody 和 Fody
Costura.Fody
是 Fody
中的工具(載入項)之一,通常情況下只需安裝前者即可,後者會自動安裝。
第二步:新增 FodyWeavers.xml 檔案
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<Costura/>
</Weavers >
Costura
有許多引數可以配置,將在下一節介紹。
第三步:編譯專案
編譯你的專案,看一下輸出目錄,dll
是不是不見了? exe
是不是變大了?
部分配置項說明
ExcludeAssemblies
預設情況下,Costura.Fody
會將所有 Copy Local
的程式集進行合併。ExcludeAssemblies
用於指定不需要合併的程式集,注意檔名中不要字尾。
<Costura>
<ExcludeAssemblies>
Foo
Bar
</ExcludeAssemblies>
</ Costura>
或者
<Costura ExcludeAssemblies='Foo|Bar' />
IncludeDebugSymbols
控制是否將程式集的相應 pdb
檔案嵌入,預設值為 true
。
<Costura IncludeDebugSymbols='false' />
CreateTemporaryAssemblies
在程式執行時,將被嵌入的程式集生成到本地,預設值為 false
。如果該程式集的正常執行依賴於其實體地址,一定要啟用此功能。
<Costura CreateTemporaryAssemblies='true' />
DisableCleanup
預設情況下,被嵌入的程式集將從編譯的輸出目錄中清除,可通過該屬性來禁用清理。
<Costura DisableCleanup='true' />
高階使用
- 非託管程式集的嵌入
<Costura Unmanaged32Assemblies='Foo32|Bar32' Unmanaged64Assemblies='Foo64|Bar64'/>
- 本地庫和預載入順序
<Costura PreloadOrder='Foo|Bar' />