2010-09-01 65 views
0

說我有一個COM類型的負載,我想檢查一個特定類型是否已經註冊。我可以使用Activator.CreateInstance來實際嘗試和創建該類,但是我想知道是否有一種更簡單的方法實際上是事先檢查該類是否實際註冊。如何測試COM類型是否已註冊?

我不想直接去註冊表 - 我正在尋找一些易於使用的東西,如上面的Activator.CreateInstance調用。

謝謝

回答

1

注意: Activator.CreateInstance不會直接創建COM類實例,它需要生成並安裝互操作程序集(例如通過tlbimp.exe)—,但這在此沒有任何區別。

最簡單的方法來檢查而不讀取註冊表是嘗試創建一個實例,並捕獲由於類型不可用而可能出現的異常。 (例如COMException如果底層組件沒有正確安裝,TypeLoadException(IIRC)如果互操作程序集丟失。)

+0

好點 - 我對COM互操作如何工作的理解是非常基本的。謝謝你的回答 - 這就是我會天真地做到這一點。 出於興趣,如果您必須處理32 \ 64位問題,註冊表方式不是一個痛苦嗎? – cristobalito 2010-09-01 08:30:28

+1

@cristobalito可能有很多地方需要檢查,通過限制到不合適的情況,您可以將其減少到HKCR:\ CLID \ \ InProcServer32和HKCU:\ Software \ Classes \ CLSID \ \ InProcServer32(註冊表路徑重映射將爲您處理32/64位問題)。 – Richard 2010-09-01 09:00:06

+1

如果您使用註冊表解決方案,則還需要照顧「免費註冊COM」。 – Vagaus 2010-09-01 15:19:11