InteropAssembly COM中的COMException

时间:2011-08-08 18:05:49

标签: .net exception com com-interop

我有一台COM服务器。如果我以这样的动态样式调用它的方法,如果另一方面出现问题,我会得到完整的异常

try
{
    Type factoryType = Type.GetTypeFromProgID("VPI.TcHost.TcAppFactory");

    dynamic factory = Activator.CreateInstance(factoryType);                
    dynamic appl = factory.CreateTcApp("Nga", "8.7");                                       
}
catch (COMException ex)
{
    //Here i get nice exception with _FULL_ description message
}

当我创建InteropAssembly并像这样调用它的方法时,如果另一方面出现问题,我会得到一个简短的异常包装器

try
{
    CTcAppFactory appFactory = new CTcAppFactory();
    CNgaApp mApp = appFactory.CreateTcApp("Nga", "8.7");
}
catch (COMException ex)
{
    //Here i get short exception with hex code without Error string that was sent 
    //from COM server
}

这就是异常短暂的样子。 (它不包含我的COM服务器发送的问题的描述) Incorrect exception

如何在强类型代码变体中获得完整异常?

1 个答案:

答案 0 :(得分:2)

DISP_E_EXCEPTION是一个COM错误,通常仅在您使用COM服务器后期生成时生成。就像你在第一个片段中所做的那样。奇怪的是,它出现在早期版本中,但技术上可行,如果COM服务器本身在其他类型的COM服务器上使用后期绑定并且只是传递错误代码。然而,CLR互操作层现在不会轻易从IDispatch :: Invoke()获取EXCEPINFO。除非COM服务器正确实现IErrorInfo,否则它似乎没有。

你可以做的不多,作者显然似乎只支持后期约束。联系他寻求支持或者回到后期。