3

私たちの状況を説明するのは難しいです。

3層アプリケーションがあります。エンジンは C++ でコーディングされた DLL であり、API 呼び出しを介してエンジンにアクセスする VB6 ActiveX EXE があり、最上位には相互運用 DLL で中間層を呼び出す Excel アドイン (VSTO フレームワークを使用した C#) があります。 . この時点で、アドインからエンジンへの「接続」ごとに新しい EXE が作成され (VB6 は API 呼び出しを使用してエンジンにアクセスします)、すべて正常に動作します。現在、中間層を .NET に移動しています。「おそらく」正常に動作します (ユニット テストはすべてパスします) が、2 つの「接続」を同時に開いたときにエラーが見つかりました (アップ、ユニット テストなしでこの状況を確認します)。これは新しい動作だからです)。DLL には、同じプロセス内のすべてのインスタンスで共有される静的オブジェクトがあり、「接続」間の相互作用があります。私たちの古いバージョンでは、それぞれの「接続」

この質問のヒントに従ってください。中間層でプロセス外オブジェクトを実行するために C# で COM EXE を作成しようとしましたが、結果は同じでした。それらは静的オブジェクトを共有し、最後に、各接続は独立したプロセスを作成しません。

API呼び出しをATLに移動するか、静的オブジェクトをハンドル付きのインスタンス化可能な参照に変更し、すべてのAPI呼び出しを変更してこのハンドラーを取得/設定することは明らかですが、現時点では手頃な価格ではありません。MS All-in-one ですべての例を確認しましたが、解決策が見つかりませんでした。一度に 1 つの接続のみを保持することもできません。各ワークブックは 1 つの接続を持つことができます。将来的には、同時に複数の接続を持つ Web アプリケーションを調査したいと考えています。

なにか提案を?

前もって感謝します、

4

3 に答える 3

3

COMが各COMオブジェクトごとに新しいEXEを開始するか、単一のEXEを使用してすべてのオブジェクトをインスタンス化するかは、CoRegisterClassObjectに渡されるフラグパラメーターによって制御されます。見る

http://msdn.microsoft.com/en-us/library/ms693407(v=vs.85).aspx、および

http://msdn.microsoft.com/en-us/library/ms679697(v=vs.85).aspx

REGCLS_SINGLEUSEまたはREGCLS_MULTI_SEPARATEフラグを渡す必要があります。

ここでの秘訣は、このメソッドを直接呼び出さない可能性があるため、このフラグを渡すことです。詳細は、COMEXEの実装方法によって異なります。

于 2011-06-06T17:12:36.997 に答える
2

質問からは明らかではありませんが、VB6 EXEとして構築された「中間層」のように聞こえ、それを.net DLLに置き換えようとしています。その場合は、説明した動作が確実に得られます。

VB6 EXE com プロジェクトでは、新しいオブジェクトをインスタンス化すると、新しいプロセスが開始されます。.net dll (または実際には Vb6 dll) を使用すると、+新しいプロセスを取得できなくなります。

VB6 exe と同じように COM オブジェクトを公開する .net EXE を作成するか、(すでに調査済みのようです) EXE オブジェクトをリファクタリングして、1 つのインスタンス内で複数のインスタンスを適切に処理する必要があります。処理する。

正直なところ、このようなシングルトンに依存することは一般的に悪いコード臭であるため、おそらく後者の方がよいでしょう。しかし、ピンチです。VB6 exe の動作を .net プロジェクトで再現できるはずです。dllでそれを行うことはできません。

于 2011-05-26T15:02:50.887 に答える
1

中間層は.Netで作成されましたか?そうであった場合は、COMクラスがCOMオブジェクトではなくネイティブの.netオブジェクトとして作成されているという問題に直面している可能性があります。このソリューションには通常、プライマリ相互運用機能アセンブリの使用が含まれます。このSOの質問を見て、問題と一致するかどうかを確認してください。

于 2011-06-07T20:33:40.933 に答える