問題の概要: COM 相互運用機能が有効/表示可能な C# DLL があります。この C# DLL には、WCF サービスへのサービス参照があります。C# コードで WCF サービスをインスタンス化すると、COM 相互運用機能がエラー HRESULT (0x80131509) を返します。
問題の詳細:
私のソリューションには 3 つのコンポーネントがあります。1 つ目は、アンマネージ C++ アプリケーションです。この C++ アプリケーションは、WCF サービスと通信する必要があります。私が決定したアプローチは、C++ アプリケーションと WCF サービスの間に C# 中間層を作成することでした。C# レイヤーは、COM 相互運用機能を有効にして表示できるようにすることで、C++ アプリケーションがそれを呼び出すことができ、C# コードが WCF サービスとの通信を処理できるようにします。C++ 側は、WCF サービスについて知る必要はありません。COM 相互運用呼び出しは、関係する限りブラック ボックスです。
C# コードで WCF サービス クライアントをインスタンス化しようとすると、問題が発生します。テストを容易にするために、C# DLL に Test() メソッドを作成しました。Test() を呼び出すと、ハードコードされたテスト文字列が返されます。これは機能します。COM 相互運用機能を介して C# DLL を呼び出す C++ アプリケーションを起動でき、テスト文字列が返されます。HRESULT は S_OK です。ここで、WCF クライアントをインスタンス化するだけの1行を追加して Test() メソッドを変更すると、COM 相互運用呼び出しは 0x80131509 の HRESULT を返すようになりました。
私が持っている唯一の手がかりは、C# DLL をコンパイルすると、次の警告が表示されることです。
warning : タイプ ライブラリ エクスポーターの警告処理 '[my WCF service]'. 警告: タイプ ライブラリ エクスポーターは、ジェネリック クラスから派生し、[ClassInterface(ClassInterfaceType.None)] としてマークされていないタイプを検出しました。このような型のクラス インターフェイスを公開することはできません。[ClassInterface(ClassInterfaceType.None)] で型をマークし、ComDefaultInterface 属性を使用して COM への既定のインターフェイスとして明示的なインターフェイスを公開することを検討してください。
WCF サービス タイプのエクスポートに関する警告が表示される理由がわかりません。C# 中間層を使用することで、WCF サービスの存在を C++ アプリケーションから分離できることを期待していました。
では、COM が有効な DLL で WCF サービスを使用するための秘訣は何ですか?