2010-01-30 83 views
4

如何在運行使用它們的操作之前檢查COM對象是否存在(已註冊/可用/可以無問題地運行)?C#在執行某些操作之前檢查COM對象是否可用

我的應用程序應該使用其他應用程序的COM(InteropServices),但在我開始一些行動之前,我想檢查我是否可以創建COM對象。

如果COM在同一個目錄中,但它們不在,它就會成爲一個問題。

在示例中。 我想檢查,如果某事像這樣:

CDNBase.ApplicationClass App = new CDNBase.ApplicationClass(); 

會導致開捕異常或東西。比我可以創建漂亮的MessageBox並阻止一些事件,直到它將被修復。 任何其他解決方案,如檢查命名空間是否存在或某物,也是好的(我猜:D)

我試圖使用try/catch,但它失敗,谷歌沒有帶給我什麼特別的,所以即時要求你的幫助。

在此先感謝

回答

1

您是否嘗試過捕ComException

try 
{ 
... 
} 
catch(System.Runtime.InteropServices.COMException ex) 
{ 
    // log error message 
    throw; 
} 

UPDATE:道歉,我並不是說要打壓例外。已更新。

或者,你可以在註冊表中搜索組件ClassID

HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32 

默認值將包含文件系統的完整路徑DLL。

+0

是的,但不能在相同的方法中捕獲異常。它以其他方式工作: 在buttonClickMethod(或其他地方,我開始這段代碼),我有: this.runSynch(); ()){ CDNBase ... App = new CDNBase ... //(其餘代碼...) } 並在buttonClickMethod我有: 嘗試{runSynch} catch(FileNotFoundException ex){msgBox ..所以它的工作原理是:我想讓它工作;) 乾杯 – cichy 2010-01-30 10:27:30

+0

這種方法本身很容易出錯:您需要處理32/64位差異(例如安裝32位COM對象,但這是一個64位進程)。流程實施如何?僅僅因爲密鑰存在並不意味着實現文件存在,或者進程有權訪問它。 – Richard 2010-01-30 10:34:07

+0

是的,不要這樣做。 – 2010-01-30 10:35:44

2

沒有人喜歡看到錯誤消息。但這是一個特例,不要這樣做。 COM激活一直很難排除故障。但最近的發展,如64位操作系統,註冊表虛擬化,註冊表重定向和UAC已經成倍增加了它可能無法工作的方式。

客戶的IT人員需要的最後一件事是另一層代碼,它會默認更改激活規則或抑制診斷信息。當它不起作用時,他們會向你射擊一些嚴重的聲音,並且他們無法找出原因。

首先問自己,如果你的程序在interop不起作用時仍然有用。如果不是,則不要做任何事情,只要讓異常終止你的程序,但要確保異常細節清晰可見。

如果它仍然有用,那麼只需將一個配置選項添加到您的程序中,即使沒有嘗試,也可以繞過互操作。

+0

那麼,我需要集成一個應用程序(www)與其他exe。所以我寫了soap-webservice,幾乎完成了小型集成應用程序,它使用這個.exe的COM來執行一些操作;) 簡而言之:它必須具有可用的COM。沒有他們,我可以關閉我的應用程序:D 但謝謝你的回答,因爲我沒有太多的經驗來開發更大的APS。 – cichy 2010-01-30 10:39:28

+0

對,只是讓它崩潰,不解決問題。 – 2010-01-30 13:36:15

相關問題