昔、私は VC++ 7.x (Visual Studio 2003 および .Net 1.1) を使用して、ATL ライブラリを使用してアウトプロセス (つまり EXE) COM サーバーを作成しました。サーバーはマルチ スレッド アパートメント (MTA) モデルを使用し、DCOM 呼び出し (VB6 クライアント) によってアクティブ化されます。複数のクライアント要求は、最初の要求によって (COM インフラストラクチャによって自動的に) アクティブ化される単一のプロセスによって満たされます。
これは非常に複雑なコードであり、いくつかの変更を加える必要があります。残念ながら、私がビルドしたマシンはとうの昔になくなっており、VS 2003 を搭載した新しいマシンでプロジェクトをコンパイルすることさえできません。数年前、私はこのプロジェクトを VS 2005 に移行しようと考えましたが、 ATL ライブラリへの重大な変更があり、その努力を断念しました。
この古い VS 2003 C++ プロジェクトを構築するという現在の問題に取り組むのではなく、.NET でこのプロジェクトを書き直すことをいじっています。これにより、私の小さなショップ (もう C++ を扱っていません) でのメンテナンスが容易になります。ATL マクロと C++ イディオムは、私の記憶から消えて久しいので、そこに残しておきたいと思います。:-)
そのため、C#/VS2008 でこの書き直しを行うことがどれほど実現可能かを調査しています。.NET クラスを COM クライアントに公開できることは知っています。確かに、私は過去にいくつかの単純なものでそうしました。ただし、これははるかに複雑です。多くのことがわかりません:
インターフェイスはすべて、クライアントによって使用されるタイプ ライブラリで定義されます (変更されないままにしておく必要があります)。既存のタイプ ライブラリに基づいて、これらのインターフェイスを実装する .NET サーバーを構築できると仮定してもよろしいですか?
サーバーは、IDispatch から継承し、"dual" および "oleautomation" でマークされた多数のインターフェイスを実装します。例として:
[odl, uid(...), dual, oleautomation] interface IKDFTSearchManager : IDispatch { HRESULT Method1(...); HResult Method2(...); }IDispatch メソッドを使用するクライアントはないと思いますが、interop によって生成された VTable が一致する必要があると思います。これを .NET サーバーからどのように公開しますか?
コンポーネントを収容するプロジェクトの種類は? コンソール アプリケーション?
EXE が相互運用ツールの 1 つに適切に登録されている場合、DCOM はおそらく EXE をアクティブにします。そうですか?インフラストラクチャは、C++/ATL サーバーの場合と同じように動作しますか?つまり、複数のクライアント要求にサービスを提供する単一の EXE がアクティブになりますか?
(4) に関連して、このサーバーはマルチスレッド アパートメント モデルを使用しますか?