2017-03-17 6 views
1

これは重複している可能性があります。しかし、私は迅速な解決策を見つけることができませんでした。私を助けてください。ライブラリ内の共有変数は、そのライブラリを参照するすべてのアプリケーションで共有されていますか?

GetData(ByVal contextId as Integer)というクラスのデータベースをデータベースから取得し、Public Shared _ContextData As Stringという共有変数に格納するライブラリプロジェクトがあります。そして、このライブラリプロジェクトは3つのウィンドウアプリケーションを参照しました。

3つのWindowsアプリケーションがすべて同時に実行されていて、そのライブラリの上記の方法を使用して異なるcontextIdのデータをデータベースから取得しようとするとします。

contextIdの値をアプリケーション間で共有する可能性はありますか?

私は以下のリンクを既に参照しました。しかし、彼らはWebアプリケーションのための解決策を教えていました。

Link 1

Link 2

+0

あなたのリンク1は*ウェブアプリケーションではない*として*具体的に*特徴付けられていました。 –

答えて

2

Sharedが唯一のアプリケーションとないすべてアプリケーションごとに共有されて、私は怖いです。 DLLをロードすると、アプリケーションのメモリにロードされます。したがって、各アプリケーションにはライブラリの独自のインスタンスがアプリケーションメモリにロードされています(つまり、Sharedはクロスアプリケーションでは機能しません)。

多くのアプリケーションでデータを共有する場合は、Memory Mapped Filesを調べる必要があります。

2

いいえ、Shared変数はのApplicationDomain(通常はプロセスごとに1がある)にバインドされています。あなたのケースでは、あなたのWindowsアプリケーションの各プロセスのメモリ内に別々の変数があります。それぞれのWindowsアプリケーションを実行すると、3つあります.Windowsアプリケーションのインスタンスを2つ実行すると、6つの別々の変数があります。

プロセスの境界を越えて価値を共有したい場合は、WCFや名前付きパイプ通信などのクロスプロセス通信技術を検討する必要があります。また、サービスの作成もオプションです。

より簡単なオプションは、各アプリケーションがアクセスするデータベースまたはファイルに値を格納することです。これらのオプションのいずれにおいても、2つのアプリケーションが同時に値にアクセスするときの並行処理状況を処理する方法について考える必要があります。

contextIdが選択されても変更されない場合は、メインアプリケーションがあり、このアプリケーションでcontextIdを選択することです。このメインアプリケーション(例えばProcess.Startを使用)から他のアプリケーションを起動し、コマンドライン引数としてcontextIdを渡します。これらの「子」アプリケーションは、起動時に与えられるcontextIdを使用します。

関連する問題