2012-02-01 115 views
1

我創建一個C#COM互操作爲C++調用。 我已經通過regasm註冊了dll和tlb文件。一切順利,直到有一天我改變了C#部分的代碼(我沒有改變接口的定義,只是實現改變了)。 COM中的一個接口返回錯誤0x80131509。奇怪的是,它只發生在一些計算機上(我的開發PC運行良好,所以我無法調試這個問題)。我不太清楚C#COM如何與C++一起工作,在我註冊它們之後,我只知道它們在窗口註冊表中創建了關鍵值(如regasm/regfile生成的)。 C++如何知道COM DLL在哪裏(搜索路徑環境變量)?以及在運行時使用tlb文件?C++調用C#COM互操作錯誤:HRESULT 0x80131509

有什麼建議嗎?

回答

0

我認爲你的問題與註冊表有關...你應該嘗試註銷並註冊(使用regasm)你的DLL在有這個問題的計算機上。

如果這樣做不起作用註銷這些計算機上的dll,而不是使用regedit搜索並刪除引用它的任何缺少的註冊表項,然後再次註冊您的dll。刪除缺失的密鑰後,您也可以使用其中一個註冊表清理程序,以確保您不會遺漏任何內容。

請記住,你應該註冊一個dll到它將被你的應用程序使用的目錄中,這應該只發生一次。如果你需要註銷一個dll,那麼你應該在註冊時使用的目錄中執行它。換句話說,一旦dll被註冊不要移動它

注意:如果你的dll與C++應用程序不在同一條路徑上,它應該放在PATH環境變量中引用的目錄中。

+2

感謝您的回覆。今天,我登錄了問題PC,最終找到了錯誤的原因。這是因爲C#COM部分拋出了一個異常,但我沒有抓住它。我無法重現的原因是他們連接到差異數據庫。 – ArdenZhao 2012-02-02 08:53:44

0

當我從Visual FoxPro調用.Net4 C#COM對象時,得到了相同的錯誤消息。

該方法返回對象,該對象的類型可能是其中的一個。所有類型都是從一個抽象類派生而來的,它爲這些類型實現了一個通用接口。

最後,我決定從基類中刪除abstract-modifier,並將其設置爲公共和ComVisible。這解決了我的問題,即使我希望基類是抽象的。