了解NetCore中的Fody

有没有想过这样一个场景,每当我早上离开家里的时候扫地机器人自动工作、窗帘自动拉开、所有灯光自动关闭,不需要每天不厌其烦地重复做这些动作?

Fody为此而生。Fody在编译器把你的代码编译为IL语言之前编辑IL代码插入这些自动化操作。

 

下面是Fody的官方介绍:

Fody 是用于编织 .net 程序集的可扩展工具。它允许在生成过程中操作程序集的 IL,通常这需要大量的管道代码。此管道代码涉及 MSBuild 和 Visual Studio API 的知识。Fody 尝试通过可扩展的外接程序模型消除该管道代码。

Fody 让世界变得更加简单。

Fody实现为一个Nuget包,它允许你用特性注解你的代码,然后用IL注入自动生成代码。

下图显示了整个过程的工作原理:

聊一下:了解NetCore中的Fody

 

我们可以引用Fody 引擎的核心代码库,然后扩展做我们自己的自动化操作。

有几个比较知名的实现:

1、实现守卫模式的空参数检查:Fody/NullGuard

2、方法计时:Fody/MethodTimer

3、使所有字符串比较不区分大小写:Fody/Caseless

4、在全局级别配置异步代码的 ConfigureAwait:Fody/ConfigureAwait

 

下面以ConfigureAwait.Fody为例示例下使用方法:

1、首先添加nuget包:

PM> Install-Package Fody

PM> Install-Package ConfigureAwait.Fody

2、然后生成在VS项目中右键生成,Fody会自动创建一个FodyWeavers.xml文件在根目录

3、默认xml文件不会设置ConfigureAwait(false),需要在FodyWeavers.xml的ConfigureAwait节点添加 ContinueOnCapturedContext="false"

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">

<ConfigureAwait ContinueOnCapturedContext="false" />

</Weavers>

4、可以了一切就绪。

使用ILSpy反编译程序集生成的dll,可以看到ConfigureAwait.Fody已经在编译期间自动在异步方法调用后面加上了.ConfigureAwait(continueOnCapturedContext: false)

 

6、使所有字符串比较不区分大小写:Fody/Caseless: Change string comparisons to be case insensitive.
7、在全局级别配置异步代码的 ConfigureAwait:Fody/ConfigureAwait: Configure async code's ConfigureAwait at a global level

 

posted @ 2022-07-21 15:07  wzyandi  阅读(2901)  评论(0)    收藏  举报