博客 / 詳情

返回

fody插件在.NET Core程序中的應用

瞭解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 的配置文件,內容如圖所示:

 title=

構建項目

完成配置後,重新構建項目即可。

其中Costura.Fody會在編譯過程中自動工作:

  1. 收集所有被項目引用的託管 DLL。
  2. 將這些 DLL 作為資源嵌入到主輸出的程序集(通常是.exe 或 .dll)中。
  3. 同時,它會修改程序的入口點,在程序運行時自動從嵌入的資源中加載這些依賴項。

如圖所示:

 title=

安全防範

引用的 DLL通過Fody插件嵌入進主輸出的程序(比如dll)內,就是作為dll的資源存在的。

Virbox Protector支持對.net core dll進行保護,但我們不建議對內嵌的dll進行先加殼,然後在輸出到另一個文件內;

這主要是在Windows系統上加殼後程序運行時不需要查找映射區域,在Linux系統上運行時Fody插件會自動將資源文件進行映射,導致程序運行時找不到映射的區域。

因此,我們建議直接主輸出的程序(比如dll)進行保護,然後加殼時選擇資源加密來保護內嵌的dll文件。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.