私は CLR プロファイリング API に関するいくつかの記事を見てきましたが、それらの記事の多くは SetILFunctionBody() を呼び出して実際の IL 書き換えを行うことについて述べています。ただし、実際のメソッド IL バイトを書き換えるために何を使用できるかを正確に説明している記事はありません。IL を作成できる管理されていないライブラリはありますか、それとも自分で作成する必要がありますか?
5 に答える
おそらく。場合によります。
Mono プロジェクトには Cecil というライブラリがあり、次の場所からアクセスできます。
ただし、これはマネージ コードであるため、プロファイリング中に呼び出すことはできません。ただし、いくつかのオプションがある場合があります。
- IPC を使用します。新しいプロセスを生成し、そのプロセスで cecil を使用して書き換えを行い、名前付きパイプを使用してバイトをプロファイラーに戻すことができます。
- CECIL を C++ に移植します。コードは MIT / X11 ライセンスの下で配布されているため、変更を共有しなくてもこれを行うことができます。
- ゼロから自分のものを書くだけです。
#1は、余分な複雑さをもたらします。プロファイラーは、実際に必要以上の可動部分を持つことになります。また、IPC は余分なオーバーヘッドをもたらします。
#2は時間がかかります。Cecil がまだバージョン 0.6 であることを考えると、独自の実装を作成するよりも、それを行うのに時間をかける価値はないかもしれません。
#3 は、最大限の制御を提供し、おそらく最もパフォーマンスが高いでしょう。ただし、#1よりもかなり多くの労力がかかります。
OpenCover https://github.com/sawilde/opencoverの簡単なものを書きました。
この記事には、探しているものが含まれている可能性があります http://www.codeproject.com/KB/cs/IL_Rewriting.aspx
実際のバイトはどこかから取得する必要があり、プロファイリング API を使用しているだけの場合は、自分で提供する必要があります。この記事では、その方法について詳しく説明しています (おそらく、あなたが読んだ記事の 1 つです): http://msdn.microsoft.com/en-us/magazine/cc188743.aspx
より「一般的な」手法は、必要なコードを好みの言語で実際に記述し、それを IL にコンパイルすることです。次に、設計時に OpCode を抽出してアクセスできる場所に保存するか、実行時にコンパイル済みの IL から抽出して必要な場所に詰め込むことができます。
私の知る限り、これを支援する管理されていないライブラリはありません。
さまざまなタイミング情報を取得するのではなく、時間を短縮できるように時間がかかっていることを確認したいので、これを行う必要があると思います。IMHO、IDE でアプリを実行してランダムに一時停止できる場合は、プロファイリング API は必要ありません。理由は次のとおりです。