.Net メソッドから呼び出す必要がある VB6 COM コンポーネントがあります。リフレクションを使用して COM オブジェクトのインスタンスを作成し、次の方法でアクティブにします。
f_oType = Type.GetTypeFromProgID(MyProgId);
f_oInstance = Activator.CreateInstance(f_oType);
インスタンス化する必要がある型の ProgId はさまざまであるため、tlbimp を使用して COM DLL に対してライブラリを作成するのではなく、GetTypeFromProgID を使用する必要があります。次に、Type.InvokeMember を使用して、次のようにコードで COM メソッドを呼び出します。
f_oType.InvokeMember("Process", BindingFlags.InvokeMethod, null, f_oInstance, new object[] { param1, param2, param3, param4 });
発生した TargetInvocationException をすべてキャッチしてログに記録し、TargetInvocationException.InnerException フィールドから詳細なエラーの説明を取得できます。ただし、COM コンポーネントが Error.Raise を使用してエラー番号を生成することはわかっており、呼び出し元の .Net アプリケーションで何らかの方法でこれを取得する必要があります。
この問題は、TargetInvocationException が通常の COMException である場合に予想されるエラー番号を含まないことに起因しているようです。
.Net コードの COM オブジェクトからエラー番号を取得するにはどうすればよいですか?
また
COM コンポーネントが失敗したときに、TargetInvocationException ではなく COMException (エラー番号を含む) を引き起こす方法で、これと同じ呼び出しを行うことはできますか?
また、ターゲット プラットフォームは .Net 2.0 であり、VB6 のソース コードにアクセスできますが、VB6 から発生したエラー メッセージを変更してテキストの一部としてエラー コードを含めることは、ちょっとしたハックだと考えています。