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 重写插件 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp

随机推荐

  • 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 将一些代理类型重写到程序集中 现在效果很