gpt4 book ai didi

c# - Fody NuGet 包如何在编译过程结束时合并程序集?

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:19 27 4
gpt4 key购买 nike

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

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

我想知道 Fody 如何能够在构建后运行代码而无需任何明显的配置更改。

最佳答案

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

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

在 Costura 的情况下(再次简化),它将每个引用程序集转换为嵌入式资源。然后它会向您的程序集添加一个模块初始化器。模块初始值设定项(在 C#9 之前无法用纯 C# 编写的东西)保证在程序集中的任何代码被调用之前运行——将其视为静态构造函数,但对于程序集而言。

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

FodyCostura文档详细解释了这是如何工作的。

关于c# - Fody NuGet 包如何在编译过程结束时合并程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51182825/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com