fody插件在.NET Core程序中的应用
了解Fody插件
Fody 是一个强大的 .NET 编译器扩展工具,它的核心能力是在代码编译过程中,直接修改生成的 IL(中间语言),这表示可以在不直接修改源代码的情况下,为程序集添加新的功能或逻辑。
Fody 采用插件式架构,其功能通过不同的插件(称Weavers)来实现。
Fody插件优势
代码增强
Fody 允许开发者通过各种插件在编译时自动修改 IL 代码,从而实现功能增强。
常见用途包括属性更改通知、方法拦截、资源注入等。
减少样板代码
使用 Fody 可以显著减少手动编写的重复性代码,例如实现 INotifyPropertyChanged 接口时所需的大量样板代码。
性能优化
某些插件可以在编译期完成原本需要在运行时处理的任务,从而提升程序性能。
例如,通过 ILAccess.Fody 直接访问私有成员而避免使用反射。
简化部署
如 Costura.Fody 插件可以将所有依赖的 DLL 文件打包到主 EXE 文件中,生成单一文件,便于分发和部署。
以下是一些常用的官方插件:
简单应用
在 .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文件。