2012-03-10 72 views
2

我正在使用名爲「Aspen Custom Modeler」的專有化學模擬軟件包。 (ACM)ACM natiely有一個COM接口,您可以使用它來驅動它。 AspenTech希望有人使用Visual Basic與ACM進行交互,但我並不喜歡VB,而是使用C#。這給我帶來了各種麻煩。COMException導致「對象引用未設置爲對象的實例」

我最新的問題是,ACM將拋出一個例外,即使在正常使用情況下可能出現的簡單錯誤也是如此。我有一個數據集無法收斂。 ACM拋出一個COMException,STS_F_Failure。在Visual Basic中,我得到了正確的類型,但在C#中,出於某種原因,我得到了「對象引用未設置爲對象的實例」異常。

我的猜測是Interop庫沒有正確的異常類型。有誰知道一種方法,我可以得到例外的正確類型?

回答

1

CLR將盡最大努力使COM對象看起來像.Net對象,尤其是對於異常。它將檢查具體的HRESULT值,查看IErrorInfo等信息......以確定最佳.Net方式來表示失敗。

在這種情況下,它似乎選擇NullReferenceException這意味着它很可能是該方法返回的值看起來像E_POINTER

控制這是很困難的。您唯一真正的選擇是生成.Net庫,以便它使用HRESULT返回而不是例外。如果這是不可能的,或者根本不可能,那麼我建議在這裏簡單地捕捉NullReferenceException

這篇文章有這個映射是如何發生

+0

它似乎並不該HRESULT對應於空指針的任何代碼相匹配的很好的解釋。 HRESULT爲189,Errlook返回「操作系統無法運行%1」。此外,我還得到了同一個庫中其他函數的異常的NullPointer異常,我很確定它們的類型不同。 – Jim 2012-03-12 22:56:30

+0

不幸的是,tlbimp似乎並沒有像ACM的良好接口那樣產生任何東西。 (編譯時綁定完全被破壞了。)所以使用tlbimp生成一個新的互操作庫沒有幫助。我懷疑寫自己的想法是一個好主意,因爲我真的對接口一無所知。 (這是專有的。)所以,我想我抓住了異常,並假裝我知道它是什麼。 – Jim 2012-03-12 23:01:49

相關問題