我正在调用合作伙伴应用程序的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