更新 : 2007 年 11 月
プロファイラが正しく記述されていないと、循環参照が発生し、予期しない動作が引き起こされることがあります。
CLR プロファイル API を一見すると、マネージ コンポーネントとアンマネージ コンポーネントの両方を使用してプロファイラを作成し、COM 相互運用機能や間接呼び出しを通して互いを呼び出すことができるような印象を受けるかもしれません。
これは設計上は可能ですが、プロファイル API はマネージ コンポーネントをサポートしていません。CLR プロファイラは完全にアンマネージにする必要があります。CLR プロファイラでマネージ コードとアンマネージ コードを組み合わせようとすると、アクセス違反、プログラム エラー、またはデッドロックが発生する可能性があります。プロファイラのマネージ コンポーネントからアンマネージ コンポーネントに対してイベントが生成され、そのイベントでマネージ コンポーネントが再度呼び出されて、循環参照が発生することになります。
CLR プロファイラがマネージ コードを安全に呼び出すことができる唯一の場所は、Microsoft Intermediate Language (MSIL) で表されたメソッドの本体です。関数の Just-In-Time (JIT) コンパイルが完了する前に、プロファイラはメソッドの MSIL 本体にマネージ呼び出しを挿入して、JIT コンパイルすることができます (ICorProfilerInfo::GetILFunctionBody メソッドを参照)。この方法で、マネージ コードの選択的インストルメンテーションや、JIT に関する統計およびパフォーマンス データの収集を行うことができます。
または、コード プロファイラを使用して、アンマネージ コードを呼び出すすべてのマネージ関数の MSIL 本体にネイティブ フックを挿入することもできます。この方法は、インストルメンテーションやカバレッジに使用できます。たとえば、コード プロファイラで各 MSIL ブロックの後ろにインストルメンテーション フックを挿入すると、そのブロックが実行されたことを確認できます。メソッドの MSIL 本体の変更には細心の注意が要求され、多くの要素を検討する必要があります。