2012-03-10 103 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

相关问题