最近,我遇到了用于修改.NET程序集的NuGet程序包,特别是Fody程序包有一个Costura NuGet“插件”,该程序在C#编译器完成后会合并程序集。
我无法找到对.csproj文件的任何修改(除了NuGet导入),该修改还显示了在构建程序集后执行的任务。
我想知道Fody在构建后如何能够在没有任何明显配置更改的情况下运行代码。
答案 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)。