ここでは、あなたが望むことを行うためのすばやく汚い方法です。これは上記のコメントの1つで、SebbyLiveを示しています。それは概念の証明に過ぎず、私はそれを本番環境で使用しようとはしません。
基本的な考え方は、変更するプロジェクトのコンパイラを変更することです。そして、この変更されたコンパイラはコードインジェクションを行います。したがって、新しいコンパイラ(AopCompiler.exe)を作成し、それをプロジェクトのビルドツールとして設定する必要があります。
<CscToolPath>$(SolutionDir)AopCompiler\bin\Debug</CscToolPath>
<CscToolExe>AopCompiler.exe</CscToolExe>
AopCompilerは、簡単なコンソールアプリケーションでなければなりません:ビルドツールとしてAopCompiler.exeを設定
は、ファイルをプロジェクトに、あなたは次の2行を追加する必要があると思い、簡単です。これは、コードの変更とコンパイルも行っています。 あなたは、最も簡単な方法は、csc.exeを自分で呼び出すことです、それを構築し、ソースコードを変更したくない場合は、次の
static void Main(string[] args)
{
var p = Process.Start(@"C:\Program Files (x86)\MSBuild\14.0\Bin\csc.exe",
string.Join(" ", args));
p.WaitForExit();
}
ですから、これまでに設定した場合、あなたが持っているだろう通常のビルドプロセスで、アスペクトを織りなすことはありません。
args
にあるものをチェックすると、csc.exeのすべてのコマンドラインパラメータを含む.RSPファイルへのファイルパスがあることがわかります。もちろん、これらのパラメータにはすべて.CSファイル名も含まれています。したがって、この.RSPファイルを解析し、コンパイルの一部であるすべての.CSファイルを見つけることができます。
C#ファイルを手元に置いて、Roslynで書き直すことができます。 CSharpSyntaxRewriter
には多くのチュートリアルがあります。例えば、here、hereです。指定された属性をチェックするカスタムCSharpSyntaxRewriter
を記述し、見つかったメソッドの先頭にログを追加する必要があります。複数の終了点が存在する可能性があるため、各メソッドの最後にログを追加するのはやや難解です。それらを見つけるには、コントロールフロー分析を使用できます。組み込みのRoslynコントロールフロー解析では、正確に何をしているのかを知ることができます。ExitPoints
プロパティは、領域外の場所にジャンプする領域内のステートメントセットを保持します。
セマンティックモデルを取得(その後、CFGの解析を行う)するには、このような何か行うことができます。
public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
{
var semanticModel = _compilation.GetSemanticModel(node.SyntaxTree);
// semanticModel.AnalyzeControlFlow(node.Block)
return node;
}
最後に、入力ファイルのそれぞれを処理するために、あなたのAopCompilerは、あなたが単に呼び出す必要がありますがリライタのVisit
メソッドをツリーのルートに追加します。これにより、変更されたツリーが作成され、ファイルに書き出すことができます。 (元のファイルを変更したり、新しいファイルに結果を書き込んだり、それに応じて.RSPファイルを変更することができます。)
申し訳ありませんが、完全な実用的なソリューションを提供していないのですが、これで十分です。
を定義している場合は、以下にのみコンパイルされます –
でこれはあなたが達成したいものではありません:http://www.sebbylive.com/articles/programming/aspect_oriented_programming_roslyn.aspx?スタンドアローンの実行可能ファイルを使って変更とコンパイルを行い、そのexeをビルドツールとして追加するという基本的な考え方。 – Tamas
私はこれらのような質問が好きです。一方では、[いいえ]と言う伝説があります(https://social.msdn.microsoft.com/forums/vstudio/en-US/3593b4d9-c3f0-4e94-818a-7958930aeb4e/injecting 'Roslynチームはコードインジェクションをサポートすると言っていると言っているが、おそらく最初のものではないかもしれないと言っている[quotes](https://gist.github.com/SimonCropp/8485964) @Bjørn-RogerKringsjåあなたは、Roslynが**これとは違って**実装する方法を通常の実装にどのように期待するのかを教えてください:http://www.codeproject.com/Articles/14334/AOP-using-System-Rlection -Emit-Code-Injection-IL –