2011-08-08 8 views
0

私はCOMサーバーを持っています。私はこのようなダイナミックなスタイルでそのメソッドを呼び出した場合は、他の側にいくつかの問題が発生した場合には、私は完全な例外を取得InteropAssembly COMのCOMException

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 interopレイヤは、IDispatch :: Invoke()からEXCEPINFOを簡単に取得することはできません。 COMサーバーがIErrorInfoを適切に実装していない限り、そうでないようです。

これについてはあまりお伝えできませんが、作者は後半の呼び出しをうまくサポートしているように見えます。サポートのために彼に連絡するか、晩年に戻ってください。

+0

ありがとうございました!素晴らしい答え。私は、COMサーバ側でIErrorInfoを実装することは素晴らしい解決策になると思います。 – Grigory

関連する問題