Fody NuGet软件包如何在编译过程结束时合并程序集?

时间:2018-07-05 03:03:02

标签: c# fody fody-costura

最近,我遇到了用于修改.NET程序集的NuGet程序包,特别是Fody程序包有一个Costura NuGet“插件”,该程序在C#编译器完成后会合并程序集。

我无法找到对.csproj文件的任何修改(除了NuGet导入),该修改还显示了在构建程序集后执行的任务。

我想知道Fody在构建后如何能够在没有任何明显配置更改的情况下运行代码。

1 个答案:

答案 0 :(得分:3)

Fody将this .targets文件添加到您的项目中。如果您有一个经典的NET Framework项目,您会看到它已添加到.csproj文件中。如果您有一个netstandard项目(新项目格式),它会在构建期间直接从nuget软件包中自动拾取,因此您不会在项目中看到它(但是您会在\ obj \文件夹中看到它,稍微重命名) 。

简化的:该目标在“ AfterCompile”目标之后执行。它搜索一个Weavers.xml文件。对于列表中找到的每个织工(例如Costura),它将调用织工的程序集。编织人员使用基于Mono / Cecil的Fody基础结构来处理程序集的IL,生成后和重写IL。

对于Costura(再次简化),它将每个参考程序集转换为嵌入式资源。然后,它将模块初始化程序添加到您的程序集中。保证模块初始化程序(某些您不能用纯C#编写的东西)可以在调用程序集中的任何代码之前运行-像静态构造函数一样考虑它,但对于程序集而言。

它添加到模块初始化程序的代码将AssemblyResolveEvent附加到AppDomain。该处理程序将使用manifest resource stream来满足Costura通过使用流中的字节调用Assembly.Load嵌入的程序集的分辨率。然后,它从处理程序中返回该Assembly对象,从而满足程序集的分辨率。 (可选)Costura可以将DLL提取到磁盘上的临时位置,然后使用该路径来满足解析(有时需要,具体取决于所涉及的DLL)。

FodyCostura文档详细说明了其工作原理。