2012-03-20 103 views
-1

我正在開發一些使用COM庫的代碼。我試圖創建一個類的實例,通過Com。 C#創建類型的COM對象

Type t = Activator.CreateInstance("TypeID"); 

但我無法得到它的所有時間= null類型。 progid已經通過Ole/COM Wever查看,似乎我確實輸入了它。 在什麼可能是prolem?

回答

4

您是否傳遞了類型ID字符串?嘗試從PROGID獲取對象類型第一:

Type t = Type.GetTypeFromProgID(progID); 
object obj = Activator.CreateInstance(t); 
+0

沒有。我使用它是這樣的:Type t = Type.GetTypeFromProgID(progID); dynamic obj = Activator.CreateInstance(t);它總是t == null; – korovaisdead 2012-03-20 13:43:14

+0

那麼它是空的還是OBJ? – Strillo 2012-03-20 13:46:03

+0

COM庫是否在系統中註冊,並確定您不在混合的64/32位環境中(例如:應用程序是64位或「兩者」,COM庫是32位) – 2012-03-20 13:54:58

-2

的問題是,Activator不能用實例化一個COM對象這樣編輯:現在,我強調這是我從你的問題理解您直接將GUID傳遞給Activator.CreateInstance)。

通常你(通過「添加引用」對話框中,「COM」選項卡)添加到已註冊的COM類的引用。然後,您可以像使用其他任何類一樣使用COM類。

或者你嘗試什麼Strillo說:-)

不過,我做我建議的方法有仍保持強類型的優勢。

+0

我從OP的理解疑問,他的傳球COM類GUID來'Activator.CreateInstance' - 就是爲什麼我寫的,他不能用它*這種方式*。我不是故意說'Activator'不能用來創建COM對象*。 – 2012-03-20 13:57:08

0

我想追加到Strillo的答案,但我沒有加註釋所需的聲譽。

我得到相同的行爲shtpavel,直到我手動註冊的COM DLL。一旦我註冊了COM DLL,Strillo的答案爲我工作。

regasm /tlb /codebase project.dll 

Regasm,可以發現:

C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/RegAsm.exe 

的項目設置生成選項卡中查看,下的輸出標題有「註冊爲COM互操作」複選框。我向自己證明這確實會註冊COM dll,但是Strillo的答案在我手動註冊dll時使用上述命令並不適用於我。

RegAsm - When is the /codebase option applicable?指出,Visual Studio的「註冊COM互操作」複選框是同樣的事情,我的命令行的解決方案。但是我的經驗是,最初「註冊COM互操作」還不夠。不知道爲什麼。