CLR プロファイリング API を使用して IL を書き換えるには、独自のアンマネージド IL ライブラリを作成する必要がありますか?
-
20-09-2019 - |
質問
CLR プロファイリング API に関する記事をいくつか見てきましたが、それらの記事の多くは SetILFunctionBody() を呼び出して実際の IL 書き換えを行うことについて説明しています。ただし、これらの記事のどれも、実際のメソッド IL バイトを書き換えるために何を使用できるかを正確に説明していません。IL を作成できるアンマネージ ライブラリはありますか? それとも自分で作成する必要がありますか?
解決
おそらく。場合によります。
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)にそれを行う方法については、深さに行く:<のhref =「http://msdn.microsoft.com/en-us/magazine/cc188743.aspx」のrel = "nofollowをnoreferrer "> http://msdn.microsoft.com/en-us/magazine/cc188743.aspx の
より「共通の」技術は実際にあなたが好みの言語で必要なものは何でもコード書き込み、ILにそれをコンパイルすることです。その後、設計時にオペコードを抽出し、あなたがそれらに達するか、コンパイル済みのILからそれらを抽出し、実行時に、あなたがそれを必要な場所にそれを詰め込むことができる場所に格納することができます。
私の知る限りこれであなたを助けるために何も管理されていないライブラリはありません。
私はあなたが時間がかかっているかを確認したいので、あなたはそれが(ちょうど、様々なタイミング情報を取得することとは対照的に)より速く行かせることができるようにこれを実行するとします。 あなたはIDEの下でアプリケーションを実行するとランダムでそれを一時停止することができればIMHO、あなたは、プロファイリングAPIを必要としません。 理由。に