瞭解Fody插件
Fody 是一個強大的 .NET 編譯器擴展工具,它的核心能力是在代碼編譯過程中,直接修改生成的 IL(中間語言),這表示可以在不直接修改源代碼的情況下,為程序集添加新的功能或邏輯。
Fody 採用插件式架構,其功能通過不同的插件(稱Weavers)來實現。
Fody插件優勢
代碼增強
- Fody 允許開發者通過各種插件在編譯時自動修改 IL 代碼,從而實現功能增強。
- 常見用途包括屬性更改通知、方法攔截、資源注入等。
減少樣板代碼
- 使用 Fody 可以顯著減少手動編寫的重複性代碼,例如實現
INotifyPropertyChanged接口時所需的大量樣板代碼。
性能優化
- 某些插件可以在編譯期完成原本需要在運行時處理的任務,從而提升程序性能。
- 例如,通過 ILAccess.Fody 直接訪問私有成員而避免使用反射。
簡化部署
- 如 Costura.Fody 插件可以將所有依賴的 DLL 文件打包到主 EXE 文件中,生成單一文件,便於分發和部署。
以下是一些常用的官方插件:
| 插件名稱 | 主要功能 |
|---|---|
| Costura.Fody | 將引用的程序集(DLL)作為資源嵌入到主程序集中。 |
| PropertyChanged.Fody | 為實現了 INotifyPropertyChanged 接口的類注入屬性通知代碼,極大簡化MVVM模式開發。 |
| MethodTimer.Fody | 在方法執行前後自動插入代碼,用於統計方法的執行時間。 |
| NullGuard.Fody | 自動為方法參數和返回值添加空值檢查,提升代碼健壯性。 |
| InlineIL.Fody | 允許你在C#代碼中直接嵌入IL指令,用於高級優化或實現一些底層操作。 |
簡單應用
在 .NET Core 項目中,若想將引用的 DLL 嵌入到主程序集中,從而減少最終發佈時的文件數量,Fody 及其插件 Costura.Fody 是經常使用的插件,它可以通過在編譯時修改中間語言(IL)來實現。
以下介紹了使用 Costura.Fody 將依賴的 DLL 嵌入到主輸出文件中的操作流程。
安裝配置
首先,在你的 .NET Core 項目中使用 NuGet 包管理器安裝必要的包。
- 通過 Visual Studio 的 “管理 NuGet 程序包” 搜索並安裝
Costura.Fody。這個包通常會同時安裝其依賴的Fody包。 -
或者,在包管理器控制枱中執行命令:
Install-Package Costura.Fody
配置文件
安裝完成後,項目根目錄下會自動生成一個名為 FodyWeavers.xml 的配置文件,內容如圖所示:
構建項目
完成配置後,重新構建項目即可。
其中Costura.Fody會在編譯過程中自動工作:
- 收集所有被項目引用的託管 DLL。
- 將這些 DLL 作為資源嵌入到主輸出的程序集(通常是.exe 或 .dll)中。
- 同時,它會修改程序的入口點,在程序運行時自動從嵌入的資源中加載這些依賴項。
如圖所示:
安全防範
引用的 DLL通過Fody插件嵌入進主輸出的程序(比如dll)內,就是作為dll的資源存在的。
Virbox Protector支持對.net core dll進行保護,但我們不建議對內嵌的dll進行先加殼,然後在輸出到另一個文件內;
這主要是在Windows系統上加殼後程序運行時不需要查找映射區域,在Linux系統上運行時Fody插件會自動將資源文件進行映射,導致程序運行時找不到映射的區域。
因此,我們建議直接主輸出的程序(比如dll)進行保護,然後加殼時選擇資源加密來保護內嵌的dll文件。