3

アプリケーションコアとして機能する1つのグローバルオブジェクトを持ち、さまざまなアプリケーション設定を保存し、データベース操作を呼び出すなど、非常に古いレガシーvb6アプリケーションがあります。異なる progid を持つ複数のモジュールがこのグローバル オブジェクトを使用しますが、シングル スレッド アパートメントのため、問題はありません。

少し前に、vb6 からの移行を提供する新しい WPF アプリケーションが作成されましたが、いくつかのアーキテクチャ上の誤りにより、依然として vb6 レガシーによって制限されています。アプリ インスタンスごとに 1 つのデータベースにのみ接続できます。ラッパー クラスに vb6 グローバル オブジェクトの静的インスタンスを保持し、レガシー機能に到達するためのブリッジとして機能します。

現在、古いレガシー コードによって制限されるべきではない新しいアプリケーションを開発しています。特に、新しいアプリケーションは一度に複数のデータベースに接続できる必要がありますが、問題があります。vb6 コードは単一のデータベースに制限されているため、 vb6 グローバル オブジェクトの複数のインスタンス (データベースごとに 1 つ)。

問題は次のとおりです。可能であれば、同じ C# アプリケーションでグローバル vb6 オブジェクトの複数の分離されたインスタンスをどのように使用できるのでしょうか?

このようなオブジェクトの各インスタンスは、独自のSTAスレッドに存在する必要があると思いますが、アプリケーションのランタイム全体で維持され、グローバル vb6 オブジェクトのインスタンスを含むラッパーが関連付けられているようなスレッドを作成する方法がわかりません。 GUIスレッドからのいくつかの関数の呼び出しをサポートします(そして、そのようなクロススレッド通信を整理する方法、thread.invoke(...)はありません)。wpf ディスパッチャー化モデル (ラッパー クラスは DispatcherObject であり、各インスタンスには独自の STA-Thread を持つ独自の Dispatcher があります) を使用することを考えましたが、そのようなものを実装する方法がわかりません。また、ラッパー クラス (静的) の各インスタンスを異なる AppDomains にロードすることで実装できると思いますが、COM の STA 問題が解決するかどうかはわかりません。

4

2 に答える 2

0

ごとにグローバル オブジェクトの 1 つのインスタンスを実行するだけで済む場合がありますAppDomain

安全のために、それらはそれぞれ独自のプロセスで実行する必要があります。これは、それらが作成されたという前提であるためです。古代のコードの仮定に違反すると、恐ろしいことが起こる可能性があることを保証します。

于 2013-10-30T02:39:18.647 に答える