2011-10-18 18 views
5

クライアントアプリケーションが読み取りおよび表示するために共有メモリ内のフィールドを更新するには、私のサービスが必要です。私はSession 0 Isolationのために私の現在の解決策が無効であることを発見しました。Windowsサービスとアプリケーションの間でメモリを共有すると、最も簡単なのは何ですか?

私は、その要素を修正し、グローバル名前空間でmutex ESの名前を変更しましたが、DLLは従順になるかのように、セッション0分離されることに一つの解決策にもかかわらず、セッション間で共有することを見ていない:

" イベントやマップされたメモリのような、名前付きオブジェクトのローカル\またはグローバル\名前空間を明示的に選択してください。

dllのどの部分が名前付きオブジェクトとして分類されているか分かりませんし、再インストールして確認するまでには時間がかかりすぎます。

名前付きチャネルのコードボリュームがわかりました。 memoryMappedFileソリューションに必要とされるディスクに触れるファイルを作成したくありません。 DLLの共有セクションを動作させることはできますか?さもなければ、最も簡単なのは何ですか?

public ref class ServerGUIBridge 
{ 
public: 
#pragma data_seg(".sdata") 
    static int commonIntShouldBeGlobal = 0; 
    static bool hasBeenInitializedMakeMeGlobal = false; 
#pragma data_seg() 
#pragma comment(linker, "/section:.sdata,rws") 

私は.NET 2.0を使用していますので、WCFは必要ありません。

+0

メモリマップファイルをINVALID_FILE_HANDLEで作成すると、ファイルは作成されません。しばらくの間アクセスされないと、ページアウトされるメモリです。共有セクションはセキュリティホールであることに注意してください。共有セクションにACLを置くことはできません。 (クライアントが入り、 'hasBeenInitializedMakeMeGlobal = false'または' commonIntShouldBeGlobal = rand() 'を実行するとどうなるか) –

+0

@Raymond" hFileがINVALID_HANDLE_VALUEの場合、呼び出しプロセスはファイルマッピングオブジェクトのサイズをdwMaximumSizeHighこのシナリオでは、CreateFileMappingは、ファイルシステム内のファイルではなく、システムページングファイルによってサポートされる、指定されたサイズのファイルマッピングオブジェクトを作成します。 - システムページングファイルがオフの場合、どこにバックアップされますか? – John

+1

「システム・ページ・ファイルによってバックアップされました」は表現が貧弱です。それは実際には「仮想メモリシステムによってバックアップされる」べきである。ページファイルが無効になっている場合、仮想メモリシステムは物理メモリに過ぎません。 –

答えて

0

よく見落とされるIPCの方法は、レジストリに書き込むことです。私がこれを共有することを提案した2人のPODメンバーが理想的な解決策になるでしょう。 IPC, MSDN, and the registry

0

すべての.NETフレームワークバージョンにはRemoting機能があります。それは別のプロセス内にあるかもしれない別のappdomainのメソッドを呼び出すことを可能にします。サンプルと使用法については、MSDNを参照してください。http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=VS.80).aspx

+0

私はRemotingについて本当に知っているべきです。ある日。それは、PC間の通信に関係しているので、かなりオーバヘッドがあります。 – John

+0

Remotingは利用できますが、新しい.NETバージョンでは廃止されましたが、はるかに柔軟性の高い(複雑な)WCFに置き換えられました。 –

1

名前付きパイプをお勧めします。 DLLを共有すると、危険に満ちているように聞こえます。 http://msdn.microsoft.com/en-us/library/aa365590.aspx

と便利探し.NET 2.0の記事はこちらです::

名前付きパイプは、ここにMSDNに記載されていますhttp://www.switchonthecode.com/tutorials/interprocess-communication-using-named-pipes-in-csharp

(ベア.NET 3.5以上がNetNamedPipeBindingクラス[http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx]を持っている心の中でそれはWCFの一部です)

+0

私は一度上昇したプロセスと通常のプロセスとの間で名前付きパイプを共有しようとしましたが、これは不可能でした。設定が必要な特別なパラメータがありますか? – RedX

関連する問題