2013-01-31 23 views
2

我使用了一個模擬工具,它使用Profiling API來即時重寫IL指令。我們的客戶通常擁有多個使用分析API的商業產品,並且在很多情況下,我們的分析器無法加載。是否有檢測.NET Profiler存在的API?

我想通過檢測.NET Profiler的存在來改善客戶體驗。如果發現第三方分析器,我想打印一條消息,以幫助客戶正確配置其環境。

到目前爲止,我還沒有找到可靠的方式來檢測.NET Profiler的存在。我想過解析ID爲1022的Windows應用程序日誌消息,並試圖通過進程ID進行匹配,但看起來很片面。我檢查了SSCLI實現,結果發現有一個功能IsProfilerPresent(),它執行所需的檢查。是否有類似的公共Microsoft API可供使用?

+1

所有分析器都使用CLR提供的同一個低級分析器接口。所以像IsProfilerPresent()這樣的東西不會告訴你任何有關正在使用的特定分析器的信息。 –

+0

是的,這是真的。我希望能得到包含profiler組件的文件名(.dll)。然後我想我會檢查它的有趣的屬性,如「文件描述」,「產品名稱」等。所以,我想我希望GetProfilerModuleFileName(...)函數。我將嘗試使用Windows應用程序日誌方法。謝謝。 –

回答

0

Microsoft提供了一個Unmanaged Profiling API,使Profiler能夠通過公共語言運行庫(CLR)監視程序的執行。該API引用兩個環境變量,該進程是否應連接到一個分析器。這些都是

  • COR_ENABLE_PROFILING:CLR的連接只有當這個環境變量存在,並且設置爲1
  • COR_PROFILER分析器:如果COR_ENABLE_PROFILING檢查通過,CLR連接到具有此探查CLSID或ProgID,其中必須 以前已存儲在註冊表中。 COR_PROFILER 環境變量被定義爲一個字符串。

here

我可不是專家攝於分析應用程序,但API似乎是你所需要的源頭。

+1

感謝您的快速回復。事實上,這是一個選擇。不幸的是,分析器通常會清除環境變量,以防止分析子進程。此外,分析器通常使用註冊表項(HKLM \ SOFTWARE \ Microsoft \ .NETFramework或HKCU \ SOFTWARE \ Microsoft \ .NETFramework)來設置COR_ *變量,這些變量在加載後也會被分析器清除(再次阻止分析其他流程)。我希望CLR提供一個我可以使用的API。謝謝。 –