2

昔、私は 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 クライアントに公開できることは知っています。確かに、私は過去にいくつかの単純なものでそうしました。ただし、これははるかに複雑です。多くのことがわかりません:

  1. インターフェイスはすべて、クライアントによって使用されるタイプ ライブラリで定義されます (変更されないままにしておく必要があります)。既存のタイプ ライブラリに基づいて、これらのインターフェイスを実装する .NET サーバーを構築できると仮定してもよろしいですか?

  2. サーバーは、IDispatch から継承し、"dual" および "oleautomation" でマークされた多数のインターフェイスを実装します。例として:

    [odl, uid(...), dual, oleautomation]
    interface IKDFTSearchManager : IDispatch {
    
            HRESULT Method1(...);
            HResult Method2(...);
    }
    

    IDispatch メソッドを使用するクライアントはないと思いますが、interop によって生成された VTable が一致する必要があると思います。これを .NET サーバーからどのように公開しますか?

  3. コンポーネントを収容するプロジェクトの種類は? コンソール アプリケーション?

  4. EXE が相互運用ツールの 1 つに適切に登録されている場合、DCOM はおそらく EXE をアクティブにします。そうですか?インフラストラクチャは、C++/ATL サーバーの場合と同じように動作しますか?つまり、複数のクライアント要求にサービスを提供する単一の EXE がアクティブになりますか?

  5. (4) に関連して、このサーバーはマルチスレッド アパートメント モデルを使用しますか?

4

2 に答える 2

2

まず、これを読むことをお勧めします( 大規模な C++ アプリケーションを C# で完全に書き直したことがありますか?)

.NET で DCOM サーバーを実装する公式の方法である ServicedComponentを調べる必要があります。

プロジェクトは、COM+ によってホストされるクラス ライブラリになります。プロジェクトをサービスとしてホストすることもできます。また、COM+ が処理するホストを記述する必要もありません。

古い tlb を参照して (ただし、プロジェクト内に p/invoke インターフェイスを記述することをお勧めします)、インターフェイスを実装できます。

古いものを保持するには、 ProgIdAttributeを使用する必要があります。

于 2009-07-06T19:05:29.850 に答える
0

私は似たようなバックグラウンドを持っており、特にクライアントにまったく触れたくない場合は、これを行うために多大な努力が必要になると想像できます。

.Net アセンブリでタイプ ライブラリをエクスポートするTlbexp.exeという .Net sdk ツールがあります。このツールを使用して、新しい C# アセンブリ (dll) に対して実行し、古い COM サーバーと同じタイプ ライブラリを生成する必要があると思います。

于 2009-07-06T19:04:50.303 に答える