我想创建一个自定义 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 不太熟悉,抱歉