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 的配置文件,内容如图所示:

构建项目
完成配置后,重新构建项目即可。
其中Costura.Fody会在编译过程中自动工作:
- 收集所有被项目引用的托管 DLL。
- 将这些 DLL 作为资源嵌入到主输出的程序集(通常是.exe 或 .dll)中。
- 同时,它会修改程序的入口点,在程序运行时自动从嵌入的资源中加载这些依赖项。
如图所示:

安全防范
引用的 DLL通过Fody插件嵌入进主输出的程序(比如dll)内,就是作为dll的资源存在的。
Virbox Protector支持对.net core dll进行保护,但我们不建议对内嵌的dll进行先加壳,然后在输出到另一个文件内;
这主要是在Windows系统上加壳后程序运行时不需要查找映射区域,在Linux系统上运行时Fody插件会自动将资源文件进行映射,导致程序运行时找不到映射的区域。
因此,我们建议直接主输出的程序(比如dll)进行保护,然后加壳时选择资源加密来保护内嵌的dll文件。