更新:2007 年 11 月
不正確撰寫的分析工具可能會造成它本身的循環參考,因此產生無法預期的行為。
檢視 CLR 分析 API,您可能產生下列印象:可撰寫包含 Managed 和 Unmanaged 元件的分析工具,並透過 COM Interop 或間接呼叫,讓這些元件彼此呼叫。
雖然從設計觀點來看這是可行的,但分析 API 並不支援 Managed 元件。CLR 分析工具必須是完全 Unmanaged。嘗試在 CLR 分析工具中結合 Managed 和 Unmanaged 程式碼,可能會造成存取違規、程式失敗或死結。分析工具的 Managed 元件會對其 Unmanaged 元件引發事件,接著這些 Unmanaged 元件會再次呼叫 Managed 元件,因此產生循環參考。
CLR 分析工具可安全呼叫 Managed 程式碼的唯一位置,是在方法的 Microsoft Intermediate Language (MSIL) 主體中。在完成函式的 Just-In-Time (JIT) 編譯之前,分析工具可以在方法的 MSIL 主體中插入 Managed 呼叫,接著對它進行 JIT 編譯 (請參閱 ICorProfilerInfo::GetILFunctionBody 方法)。這個技巧可以成功用於選擇性檢測 Managed 程式碼,或收集 JIT 的統計資料和效能資料。
或者,程式碼分析工具可以在呼叫 Unmanaged 程式碼的每個 Managed 函式的 MSIL 主體中插入原生攔截程序。這個技巧可用於檢測和涵蓋範圍。例如,程式碼分析工具可以在每個 MSIL 區塊後插入檢測攔截程序,以確定已執行區塊。修改方法的 MSIL 主體是非常精細的作業,有許多因素應納入考量。