2016-06-01 6 views
3

ILリライティングを出力アセンブリに適用するカスタムmsbuildタスクを作成します。msbuildのカスタムILリライティングプラグイン

私はすでにPostSharpを使用しており、今では書き換え機能を拡張しようとしています。

いくつかの特殊なケースでは、Mono.Cecilを使用して、プロキシタイプをアセンブリに書き換えます。これは今すぐ問題ありません。

しかし、私は実際のビルドとPostSharp変換の間のビルドプロセスをインターセプトして、次のステップでPostSharpによって実装されるプロキシタイプのアスペクトを生成したいと考えています。

私はすでにPostSharpのサポートに連絡し、方向性を得た:

PostSharpは、MSBuildのプロパティCompileDependsOn(MSDN https://msdn.microsoft.com/en-us/library/ms366724.aspx詳細)をオーバーライドすることにより、ビルドプロセスにitselftを注入します。

PostSharp.targetsがfile.PostSharp .csprojあなた*に文をインポートする前に、あなたは(MSBuildのプロパティCompileDependsOnをオーバーライドすることで、ビルドプロセスにitselftを注入CompileDependsOnプロパティをオーバーライドすることにより、コンパイル後にはなくPostSharp前に、より多くの情報を、独自のタスクを実行することができますMSDN https://msdn.microsoft.com/en-us/library/ms366724.aspx)。

コンパイル後、* .csprojファイルのPostSharp.targetsインポートステートメントの前にCompileDependsOnプロパティをオーバーライドすることで、PostSharpの前に独自のタスクを実行できます。

私はすでにオーバーライドが含まれている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プロパティを上書きする方法を知る必要があります。私は、MSBuildの-スクリプトとあまり慣れていないよ、ごめん

答えて

1

変換対象のための適切な場所は私のソリューションは、完全に私たちのエントリポイントからPostSharpを分離

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

です:

<!-- 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プロジェクトで動作します。

関連する問題