COMException导致“对象引用未设置为对象的实例”

时间:2012-03-10 01:15:31

标签: c# com

我正在使用名为“Aspen Custom Modeler”的专有化学模拟软件包。 (ACM)ACM natiely有一个COM接口,你可以用来驱动它。 AspenTech希望使用Visual Basic与ACM进行交互,但我不喜欢VB,而是使用C#。这给我带来了各种各样的麻烦。

我最新的问题是,即使在正常使用中可能出现的简单错误,ACM也会抛出异常。我有一个无法收敛的数据集。 ACM抛出COMException,STS_F_Failure。在Visual Basic中,我得到了正确的类型,但是在C#中,由于某种原因,我得到了“未将对象引用设置为对象的实例”异常。

我的猜测是Interop库没有正确的异常类型。有没有人知道我可以获得正确的例外类型?

1 个答案:

答案 0 :(得分:1)

CLR最好使COM对象看起来像.Net对象,特别是异常方面。它将检查特定的HRESULT值,查询IErrorInfo等信息,以确定最佳 .Net方式来表示失败。

在这种情况下,它似乎选择NullReferenceException,这意味着该方法很可能返回一个看起来像E_POINTER的值。

控制这一点至多是困难的。您唯一真正的选择是生成.Net库,使其使用HRESULT返回而不是异常。如果那是不可能的,或者根本不是苍白的,那么我建议只是在这里抓住NullReferenceException

本文对此映射的发生方式进行了很好的解释