msbuild 的自定义 IL 重写插件

2024-02-09

我想创建一个自定义 msbuild 任务,将 IL rwriting 应用于我的输出程序集。

目前我已经在使用 PostSharp,现在尝试扩展重写功能。

对于某些特殊情况,我使用 Mono.Cecil 将一些代理类型重写到程序集中。现在效果很好。

但现在我想拦截实际构建和 PostSharp 转换之间的构建过程,以便在下一步中由 PostSharp 实现的代理类型上生成方面。

我已经联系了 PostSharp 支持并得到了指示:

PostSharp 通过覆盖 MSBuild 属性 CompileDependsOn 将自身注入构建过程(更多信息请参见 MSDN)https://msdn.microsoft.com/en-us/library/ms366724.aspx https://msdn.microsoft.com/en-us/library/ms366724.aspx).

您可以在编译后但在 PostSharp 之前执行自己的任务,方法是在 *.csproj 文件中的 PostSharp.targets 导入语句之前覆盖 CompileDependsOn 属性。PostSharp 通过覆盖 MSBuild 属性 CompileDependsOn 将自身注入构建过程(有关 MSDN 的更多信息)https://msdn.microsoft.com/en-us/library/ms366724.aspx https://msdn.microsoft.com/en-us/library/ms366724.aspx).

您可以在编译之后但在 PostSharp 之前执行自己的任务,方法是在 *.csproj 文件中的 PostSharp.targets 导入语句之前覆盖 CompileDependsOn 属性。

我已经在 PostSharp.targets 文件中找到了包含覆盖的位置:

<PropertyGroup Condition="'$(InjectPostSharp30)' != 'False'">
<PostSharp30DependsOn>
  $(PostSharp30DependsOn);
  PostSharp30ExtractBinaries;
  BeforePostSharpTransformation; // I added this one
  </PostSharp30DependsOn>
<PostSharpInspectDependsOn>
  $(PostSharpInspectDependsOn);
  PostSharp30InspectConstants;
  PostSharp30InspectReferences;
  PostSharp30DisablePreviousVersions
</PostSharpInspectDependsOn>
<CoreCompileDependsOn>
  PostSharpInspect;
  PostSharp30DefineConstant;
  $(CoreCompileDependsOn)
</CoreCompileDependsOn>
<CompileDependsOn>
  PostSharp30TimestampBeforeCompile;
  $(CompileDependsOn);
  PostSharp30TimestampAfterCompile;
  PostSharp30
</CompileDependsOn>
<BuildDependsOn>
  $(BuildDependsOn);
  PostSharp30Verify
</BuildDependsOn>
<CleanDependsOn>
  $(CleanDependsOn);
  PostSharp30Clean
</CleanDependsOn>

我还运行了我的 msbuild 任务。它正在被调用,并且还获得了程序集的正确路径,但是当实际调用构建时,它被调用得太早并且无法找到程序集,因为构建尚未完成。

如果我附加到构建后事件 PostSharp 确实已经运行,但我需要它在自定义转换之后运行,以便使用方面实现我的类型。

我的测试任务是这样实现的:

    public class RewritingTask : Task
{
    [Required]
    public string OutputAssembly { get; set; }

    [Output]
    public string PreTransformationAssembly { get; set; }

    public override bool Execute()
    {
        string preTransformDir = Path.GetDirectoryName(OutputAssembly) + "\\PreTransform\\";

        if (!Directory.Exists(preTransformDir))
        {
            Directory.CreateDirectory(preTransformDir);
        }

        if (!File.Exists(OutputAssembly))
        {
            return false;
        }

        File.Copy(OutputAssembly, preTransformDir + Path.GetFileName(OutputAssembly), true);

        return true;
    }
}

该错误是 FileNotFoundException,因为缺少输出程序集。

基本上我需要知道如何使用 msbuild 覆盖 CompileDependsOn 属性,就像描述的 postsharp 支持一样。我对 msbuild-scripts 不太熟悉,抱歉


转换目标的正确位置是

<CompileDependsOn>
    PostSharp30TimestampBeforeCompile;
    $(CompileDependsOn);
    HERE;
    PostSharp30TimestampAfterCompile;
    PostSharp30
</CompileDependsOn>

我的解决方案将 PostSharp 与我们的入口点完全解耦:

<!-- If PostSharp is imported, override with combined targets -->
<PropertyGroup Condition="'$(InjectPostSharp30)' == 'True'">
    <CompileDependsOn>
        PostSharp30TimestampBeforeCompile;
        $(CompileDependsOn);
        ApplyILRewriting;
        PostSharp30TimestampAfterCompile;
        PostSharp30
    </CompileDependsOn>
    <BuildDependsOn>
        $(BuildDependsOn);
        PostSharp30Verify;
        AfterILRewritingPostBuild
    </BuildDependsOn>
</PropertyGroup>

<!-- If PostSharp is not imported, override with necessary targets -->
<PropertyGroup Condition="'$(InjectPostSharp30)' != 'True'">
    <CompileDependsOn>
        $(CompileDependsOn);
        HERE
    </CompileDependsOn>
    <BuildDependsOn>
        $(BuildDependsOn);
        AfterILRewritingPostBuild
    </BuildDependsOn>
</PropertyGroup>

所以我的脚本适用于 PostSharp 和非 PostSharp 项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

msbuild 的自定义 IL 重写插件 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • DispatcherTimer 未按时执行

    我正在使用 c 中的 DispatchTimer 编写一个时钟应用程序 但由于某些原因 我的时钟似乎时不时地跳过 1 秒 例如 52 秒 gt 54 秒 跳过 53 秒 在我看来 计时器并不是每秒都执行一次 DispatcherTimer
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 在通过网络发送之前压缩位图

    我正在尝试通过网络发送位图屏幕截图 因此我需要在发送之前对其进行压缩 有一个库或方法可以做到这一点吗 当您将图像保存到流时 您have选择一种格式 几乎所有位图格式 bmp gif jpg png 都使用一种或多种压缩形式 因此 只需选择适
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标

随机推荐

  • Google Apps 脚本 - JavaScript 不工作

    我创建了一个简单的网络应用程序 但它不起作用 Code gs function doGet I think this works var output HtmlService createTemplateFromFile index eva
  • 使用 Java 8 的 cobertura-maven-plugin

    是我一个人的问题还是 cobertura maven plugin 不适用于 java 8 当它运行时我得到 INFO cobertura maven plugin 2 6 instrument default provider impl
  • Oozie Shell Action 的 stdout 和 stderr 输出

    在 Oozie 站点中 它说 Shell 操作的 stdout 和 stderr 输出被重定向到运行 shell 命令的 Oozie Launcher 映射减少作业任务 STDOUT 谁能告诉我具体应该去哪里看 Oozie 在 启动器 中运
  • 递归是如何工作的? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 请用最简单的方式解释递归是如何工作的
  • Robotium:测试运行未能完成。预期 N 次测试,已收到 (N-1)

    Android 测试仍然是我头疼的问题 我创建了最简单的应用程序只是为了弄清楚如何Robotium有效 每次测试失败时都会出现错误 Running tests Test running started Test failed to run
  • subprocess.call cd 不起作用[重复]

    这个问题在这里已经有答案了 In 3 pwd Out 3 u Users aarcher Desktop scripts In 5 subprocess call mkdir p os path expanduser file path n
  • 防止在 C++ 中重新绘制窗口

    我正在编写一个全局钩子 DLL 它需要在窗口上使用 GDI 进行一些绘图以响应事件 我的问题是正在绘制的窗口不断重新绘制自身 因此我绘制的内容在我想要的之前就被删除了 有什么办法可以阻止窗户在我需要的时间内绘制任何东西吗 我的钩子目前是WH
  • PHP $_POST 只有 id,没有名称

    有人可以向我解释一下吗 我有以下代码
  • 如何为 CustomClipper 创建的小部件制作合适的边框和阴影

    我有一个Container里面的小部件ClipPath它使用一个CustomClipper 一切正常 我有所需的小部件形状 但是 我找不到为这个自定义形状的小部件制作阴影的方法 另外 我想要一个自动跟随此自定义小部件边缘的轮廓 边框 再次没
  • 不同的 ActionBar.Tab 使用不同的颜色

    我想让 ActionBar 中的所有选项卡都有不同的颜色指示器 例如选项卡 1 为蓝色 选项卡 2 为红色等 为了实现这一点 我为所有颜色创建了不同的选择器 并将它们放在可绘制的不同 xml 中 在 style xml 中我通过以下方式调用
  • 使用正则表达式 OR 运算符解决 2 个条件

    我正在尝试使用 OR 运算符将 2 个正则表达式合并为 1 个 我有一个检查字母后跟 8 位数字是否匹配的方法 Regex IsMatch s A Z d 8 我有另一个只检查 9 位数字的程序 Regex IsMatch s d 9 现在
  • Kubernetes 记录命令 TLS 握手超时

    我正在运行开源 kube 版本 1 9 在运行时出现 TLS 握手超时错误kubectl logs命令 其他kubectl命令工作正常 etc kubernetes pki gt kubectl get pods NAME READY ST
  • 按键或值对 JavaScript 对象进行排序; ES6

    在我问之前 关于这个特定主题有很多讨论 其中大部分与 ES5 相关 并不一定适用于 ES6 我试图得到一些澄清 也许可以帮助下一个在互联网上寻找答案的人 这是专门针对 ES6 的 问题 考虑以下对象结构 const unsorted obj
  • 如何在 Delphi 中使用非托管导出

    我正在用 C 创建一个项目 我想使用不受管理的出口 http sites google com site robertgiesecke Home uploads TOC Samples 后来在Delphi中使用它 那么谁能解释一下 非托管导
  • Google 地图 Android Api v2 的问题

    我一直在尝试实现一个示例应用程序 以研究 Google 地图 API 的工作原理 我对配置本身感到震惊 我似乎无法运行该应用程序 这是我在 Github 上的代码 https github com siva54 SampleMapAppli
  • 使用AJAX和远程PHP上传文件

    我正在尝试使用 AJAx 构建一个上传器 我想使用 AJAX 而不是表单和 Iframe 因为我希望默认 CSS 样式与响应一起使用 问题是 我的 PHP 位于远程服务器上 我正在使用 Shopify 但他们不允许我使用他们的 PHP 服务
  • 是否可以在 Microsoft TreeView Control 6.0 (MSComctlLib.TreeCtrl.2) 中模拟三态复选框?

    我在 Microsoft Access 中使用 Microsoft TreeView Control 6 0 它似乎工作得很好 除了它似乎没有灰色状态 表明检查了一些但不是所有子节点 我已经研究过使用我自己的图像来模拟复选框 但如果我这样做
  • Reactive Banana:如何使用远程 API 中的值并将它们合并到事件流中

    我在 WX 界面中使用 Reactive Banana 当按下按钮时 我需要从外部服务 API 检索值 我有一个通用的Behavior基于数据类型AppState基于函数转换 累积 转换后的变化 doSomeTransformation 转
  • 如何在 MySQL 中编写 JSON 数组对象的查询

    根据要求我需要改变逻辑 我有学生表和列 如 id 和 val 我想写一个选择查询 学生桌包含数据 id 值1 stdId 1 stdName 学生 stdAddress testLoc stdran 1 2 3 2 stdId 2 stdN
  • msbuild 的自定义 IL 重写插件

    我想创建一个自定义 msbuild 任务 将 IL rwriting 应用于我的输出程序集 目前我已经在使用 PostSharp 现在尝试扩展重写功能 对于某些特殊情况 我使用 Mono Cecil 将一些代理类型重写到程序集中 现在效果很