簡體   English   中英

Fody NuGet 包如何在編譯過程結束時合並程序集?

[英]How does the Fody NuGet package merge assemblies at the end of the compile process?

最近我遇到了一個用於修改 .NET 程序集的 NuGet 包,特別是,有一個用於 Fody 包的 Costura NuGet“插件”,它在 C# 編譯器完成后合並程序集。

我找不到對 .csproj 文件(除了 NuGet 導入)的任何修改,這些修改顯示了在構建程序集后執行的任務。

我想知道 Fody 如何能夠在構建后運行代碼而不會在任何地方進行任何明顯的配置更改。

.targets將此.targets文件添加到您的項目中。 如果您有一個經典的 NET 框架項目,您會看到它添加到 .csproj 文件中。 如果您有一個 netstandard 項目(新項目格式),它會在構建過程中直接從 nuget 包中自動獲取,因此您不會在項目中看到它(但您會在 \\obj\\ 文件夾中看到它,稍微重命名) .

簡化:該目標在“AfterCompile”目標之后執行。 它搜索 Weavers.xml 文件。 對於它在列表中找到的每個織布工(例如 Costura),它調用織布工的程序集。 編織者使用基於 Mono/Cecil 的 Fody 基礎架構來處理程序集的 IL、后期構建和重寫 IL。

在 Costura 的情況下(再次簡化),它將每個參考程序集轉換為嵌入式資源。 然后它將模塊初始化程序添加到您的程序集中。 模塊初始化程序(在 C#9 之前不能用純 C# 編寫的東西)保證在調用程序集中的任何代碼之前運行 - 將其視為靜態構造函數,但用於程序集。

它添加到模塊初始值設定項的代碼將AssemblyResolveEvent附加到AppDomain 此處理程序將使用清單資源流來滿足 Costura 通過使用流中的字節調用Assembly.Load嵌入的程序集的解析。 然后它從處理程序返回那個Assembly對象,從而滿足程序集的決議。 或者,Costura 可以將 DLL 提取到磁盤上的臨時位置,然后使用該路徑來滿足解析(有時需要,取決於所涉及的 DLL)。

FodyCostura文檔詳細解釋了這是如何工作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM