【问题标题】:COMException in InteropAssembly COMInteropAssembly COM 中的 COMException
【发布时间】:2011-10-22 14:58:52
【问题描述】:

我有一个 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 服务器发送的问题的描述)

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

【问题讨论】:

    标签: .net exception com com-interop


    【解决方案1】:

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

    对此你无能为力,作者显然似乎只支持后期绑定调用。联系他寻求支持或退回到后期绑定。

    【讨论】:

    • 谢谢!很好的答案。我认为在 COM 服务器端实现 IErrorInfo 将是一个不错的解决方案。
    猜你喜欢
    • 2011-03-31
    • 2011-01-25
    • 2012-12-14
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多