2011-08-08 30 views
0

我有一個COM服務器。如果我調用它的動感風格類似這樣的方法,在對對方的一些問題的情況下,我得到充分的例外InteropAssembly中的COMException 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

如何在強類型變體代碼中獲得完全異常?

回答

2

DISP_E_EXCEPTION是一個COM錯誤,通常只有在您使用COM服務器延遲綁定時纔會生成。就像你在第一個片段中所做的一樣。奇怪的是,它出現在早期版本的版本中,但技術上可行的是,如果COM服務器本身在其他類型的COM服務器上使用晚期綁定,並且只傳遞錯誤代碼。然而,CLR互操作層現在不會輕易從IDispatch :: Invoke()中獲取EXCEPINFO。除非COM服務器正確實現IErrorInfo,否則看起來好像沒有。

對此你可以做的不多,作者顯然似乎只支持後期調用。聯繫他尋求支持或者回到晚期。

+0

謝謝!很好的答案。我認爲在COM服務器端實現IErrorInfo將是一個不錯的解決方案。 – Grigory