我正在調用合作伙伴應用程序的COM組件的應用程序。我們是.Net,他們不是。我對COM不太瞭解;我知道,我們調用的組件是後期綁定即從.net調用的奇怪COM行爲.net
obj As Object = CreateObject("THIRDPARTY.ThirdPartyObject")
然後我們把這個COM對象的方法(strict選項關閉在VB文件頭):
obj.AMethod(ByVal Arg1 As Integer, ByVal Arg2 As Integer, ByVal Arg3 as Boolean)
即使這個調用起作用,這個重載也不存在於COM互操作.dll中,如果我使用Add Reference添加對COM服務器的引用,則創建這個重載。該方法可用的唯一調用方法是AMethod()
。
但是,這本身並不是什麼困擾我。令我困擾的是,這個調用工作一段時間,然後在幾十次調用成功執行後拋出TargetParameterCountException
。
我問你這樣,StackOverflow:
什麼。的。地獄。
我唯一能猜到的是COM組件的文檔聲明這個方法是同步執行的 - 所以也許任何負責拋出異常的東西都被阻塞,直到某個不確定的時間點被阻止爲止。除此之外,我完全迷戀在這個離奇的,更重要的是行爲不一致。
編輯#1:
更多的是我剛剛想起顯著信息 - 不時的調用拋出ExecutionEngineException
代替。它只是看了一眼文件,意識到這是非常糟糕。做一點挖掘,暗示了後期綁定調用導致堆棧損壞,導致整個CLR崩潰。這可能意味着運行時間在某些時候擊落了壞的電話(與TargetParameterCountException
)並且錯過了其他電話(ExecutionEngineException
)。
編輯#2:
接聽大衛·萊弗利的問題:
- 調用零參數這是目前在代碼已經存在了很長一段時間。我之前沒有能夠獲得第三方COM實現的手冊,因此可能他們已經從服務中撤回了該簽名
- 該方法只有一個位置被調用
- 這是一個桌面應用程序調用另一臺,在同一臺機器上。沒有什麼奇特的東西
- 該對象在用戶與應用程序交互的整個範圍內都存在,因此從未創建過一個新對象。
不幸的是,正如您所建議的,很可能在實現中確實存在一個錯誤。這個供應商的麻煩是,當我們報告一個bug時,他們的迴應往往遵循一般形式:i)否認有問題; ii)否認這是他們的問題; iii)拒絕修復它。這三個步驟往往跨越一段令人沮喪的長時間。
+1我們在我們的傳統C++代碼中有我們自己的IDispatch實現。爲每個IDispatch調用手動實施參數檢查。 – 2010-10-13 17:32:46
這是值得了解的 - 我可以問他們是否有自定義IDispatch接口。這是一個開始。 – 2010-10-13 17:43:05