2016-03-26 5 views
0

2つの異なるアプリケーション間で非直列化可能なコントロールオブジェクトを共有する方法はありますか?C#で実行中のアプリケーション間で非直列化可能なコントロールオブジェクトを共有する

2つのアプリケーション間でデータを共有するために以下のコードを使用しましたが、正常に動作しています。 私の問題は、これらのアプリケーション間で直列化できないオブジェクトを共有する必要があることです。

アプリケーション

try 
{ 
    using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap")) 
    { 

     Mutex mutex = Mutex.OpenExisting("testmapmutex"); 
     mutex.WaitOne(); 

     using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0)) 
     { 
      BinaryWriter writer = new BinaryWriter(stream); 
      writer.Write(0); 
     } 
     mutex.ReleaseMutex(); 
    } 
} 
catch (FileNotFoundException) 
{ 
    MessageBox.Show("Memory-mapped file does not exist. Run Process A first."); 
} 

一つ

using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000)) 
{ 
    bool mutexCreated; 
    Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated); 
    using (MemoryMappedViewStream stream = mmf.CreateViewStream()) 
    { 
     BinaryWriter writer = new BinaryWriter(stream); 
     writer.Write(1); 
    } 
    mutex.ReleaseMutex(); 

    string path = @"Second Application's path"; 

    //Run second application 
    Process pr = new Process(); 
    ProcessStartInfo prs = new ProcessStartInfo(); 
    prs.FileName = path; 
    pr.StartInfo = prs; 
    bool ret = pr.Start(); 

    mutex.WaitOne(); 
    using (MemoryMappedViewStream stream = mmf.CreateViewStream()) 
    { 
     BinaryReader reader = new BinaryReader(stream); 
     MessageBox.Show(String.Format("Process A says: {0}", reader.ReadBoolean())); 
     MessageBox.Show(String.Format("Process B says: {0}", reader.ReadBoolean())); 
    } 
    mutex.ReleaseMutex(); 
} 

Applicatin第二には、いずれかの解決策で私を助けることができます。

答えて

0

私の知る限り、メモリマップされたファイルには、ライブ管理対象オブジェクトを直接含めることはできません。メモリマップファイルを使用するには、MemoryMappedViewStream(この例では)を使用する方法とMemoryMappedViewAccessorを使用する方法があります。後者は、メモリの大きなバッファとして扱い、ReadDouble(オフセット)Write(offset、doubleValue)のような呼び出しで読み書きします。配列を読み書きするためのアクセサメソッドもあります。

+0

「MemoryMappedViewAccessor」の例、または2つのアプリケーション間でライブオブジェクトを共有する別の方法があります。 –

+0

クイックインターネット検索では、[ここ](http://stackoverflow.com/questions/10806518/write-string-data-to-memorymappedfile)や[ここ](https://msdn.microsoft.com/en) -us/library/system.io.memorymappedfiles.memorymappedviewaccessor(v = vs.110).aspx)。私はあなたが私より多くの時間を費やすと、もっと多くのことがあると確信しています。 –

+0

プロセス間でCLRオブジェクトの1つのインスタンスを自動的に共有する方法については気づきません。実際に動機付けられている場合は、共有メモリマップファイルを使用して各プロセスに存在するインスタンス間の更新を通信するラッパークラスを作成して、オブジェクトの共有をシミュレートできます。あなたの情報が複雑な場合、これは多くの作業になるかもしれません。 –