異なるプロセス間の通信

  別のプログラムがデータと対話できるようになるの異なるプロセス間のデータ伝送の問題を解決するために、プロセス間の通信。プロセス間通信の方法:1、せん断プレート2、COM 3、メモリマップファイル; 4、WCF

プロセス間の1、クリップボードクリップボード転送オブジェクト

  クリップボードには、使用するアプリケーションのための公共の場所です。.NETでDataFormats静的フィールドが含ま特定のクラス、データ・タイプは、クリップボードに格納することができる定義します。Clipboardクラスは、クリップボードにデータを使用するように置くことができます。

  クリップボードにテキストとして、SetDataObject使用する:Clipboard.SetDataObject(「クリップボードテキスト2」)、読み出し時に、最初のクリップボードにテキストがあるか否かを判断し、読み取ります。
IDataObjectデータ= Clipboard.GetDataObject()。
もし(data.GetDataPresent(DataFormats.Text))
{ 
    ます。Label1.Text = data.GetData(DataFormats.Text).ToString(); 
}

  クリップボードにカスタムデータを配置する、カスタムイメージクラス、およびシリアル化可能としてマークされた(本明細書中で使用される名前空間は、次のとおりです。TestClipboard)。キーカスタムデータ型のオブジェクトはのIDataObjectインターフェイスを実装してクリップボードのDataObjectクラスに配置されます。これは、コンテナのような、ストレージのデータをクリップボードに配置されますされています。

[直列化]
 パブリック クラスMyPic 
{ 
    ///  <まとめ> 
    /// 画像
     ///  </要約> 
    公共イメージIMG;
     ///  <まとめ> 
    /// 画像情報
     ///  </要約> 
    パブリック 文字列ImgInfo。
} 
パブリック 無効SetMyPicToClipboard()
{ 
    MyPic OBJ = 新新MyPic(); 
    obj.Img = Properties.Resources.Image; 
    obj.ImgInfoは = " テストは、クリップボードのカスタムタイプに保存されます" ;
     // データ・オブジェクトを作成し、データがロードされます
    = DataobjのIDataObject 新しい新規のDataObject(OBJ); 

    // データの他のタイプが同じオブジェクトに配置してもよい
    / * 
    dataObj.SetData(DataFormats.UnicodeText、 "テキストテスト"); 
    dataObj.SetData(DataFormats.Bitmap、Properties.Resources.Image ); 
     * / 
    // クリップボードにコピーされ、2番目のパラメータは、プログラムが終了し空でない 
    Clipboard.SetDataObject(dataobj、trueにします); 
}

  しかし、DataObjectのは、外の世界へのアクセス時に、クリップボードにオブジェクトの後に、メソッドClipboard.SetDataObjectを使用して、指定されたオブジェクトの完全な名前を入力する必要があります。データ型のみを指定したプロセスにアクセスすることができる場合は、その方法を使用することができ、名前空間を指定します。

 // 最初のクリップボードI上のデータがあるかどうかを判断:完全修飾された名前空間のタイプは、
 IF(Clipboard.ContainsData(" WindowsFormsApplication1.MyPic " ))
 { 
     のIDataObject dataobj = Clipboard.GetDataObject(); // 読み出したデータ 
     MyPic myPic dataObj.GetData =(" WindowsFormsApplication1.MyPic "AS MyPic; // データを変換 
     pictureBox1.Image = myPic.Img; 
     textBox1.Text = myPic.ImgInfo; 
 }

2、FileSystemWatcherを使用して同期化を達成する工程

コンポーネントは 、そのようなファイルが削除または変更されたコンテンツされたときに、対応するイベントがトリガされ、このフォルダのように、特定のフォルダやファイルを、監視することができます。このコンポーネントは、これは「一時的な」プロセスの通信チャネルとの間で作用することができ、複数のプロセスが同時にファイルを監視することができます。
  共有ファイルを設定し、正しくアクセス権を読み取りおよび書き込み:キーポイントは、同期プロセスを達成することです。
///  <要約> 
/// 实现写入数据
 ///  </要約> 
///  <PARAM NAME = "FILENAME"> </ param>の
公共 ボイドのsetText(文字列fileNameに)
{ 
    使用して(FileStreamをFS = 新しいFileStreamを(ファイル名、FileMode.Create、FileAccess.Write、FileShare.Read))
    { 
        使用(のStreamWriterライター= 新しいのStreamWriter(FS、Encoding.UTF8))
        { 
            writer.Write(" 内容" )。
        } 
    } 
} 
///  <要約> 
/// 实现读取数据
 /// </要約> 
///  <PARAM NAME = "FILENAME"> </ PARAM> 
公共 ボイド READTEXT(文字列filename)で
{ 
    使用(のFileStream FS = 新しいFileStreamを(ファイル名、FileMode.Open、FileAccess.Read、FileShare.ReadWrite))
    { 
        使用(StreamReaderをリーダ= 新しいStreamReaderを(FS、Encoding.UTF8))
        { 
            文字列 TXT = reader.ReadToEnd()。
        } 
    } 
}

  その後、変更されたイベント監視ファイルが発生した使用FileSystemWatcherコンポーネントを変更します。ネットワークアプリケーションでは、このコンポーネントは、ユーザが、ファイルが発見されたアップロードする場合、システムは自動的に処理フローのシリーズを開始する、ファイルをアップロードし、特定の専用ファイルを監視するために使用されてもよいです。

3、メモリマップドファイル(メモリマップドファイル)を使用すると、プロセス間通信を実装します

  意味:メモリにそれぞれ、データ用のハードディスクファイルのこの特定の領域を専用の記憶領域を開放します。アクセスの一般的なメモリアクセスも完全なように、独自のアドレス空間にこのメモリ領域をマッピングするプロセス。システムページングファイルや休止状態ファイル内の窓はとても達成可能です。あなたは、名前空間のSystem.IO.MemoryMappedFilesを参照する必要があります。

  メモリマップトファイルオブジェクトは、既存のディスクファイル(実際には、オペレーティング・システムに対応するオブジェクトの中核であり、直後に解放されたリソースの使用を注意してください)に従ってそのCreateFromFile方法を介してメモリマップファイルを作成し、メモリマップドファイルを表します。メモリマップの容量が指定されていない場合、前記、デフォルトのファイルのサイズが同じです。サイズを指定すると、その値は、既存のファイルのサイズよりも小さくすることはできません。指定されたディスクのファイルサイズは、ディスク・ファイルのサイズを自動的にメモリマップドファイルの宣言の容量の大きさに成長するよりも大きい場合。

  メモリマップトファイルオブジェクトを作成した後、あなたはMemoryMappedViewAccessorオブジェクト(メモリ・マップ・アクセス・ビュー・オブジェクト)の動作を使用する必要があり、直接読み取りおよび書き込みすることはできません。あなたはアクセス方法メモリマップトファイルオブジェクトを使用してオブジェクトを作成することができます。ここで指定した範囲では、いくつかのバイトへの最初の数バイトからファイルへのアクセスが必要な場合があります。また示すために必要なパラメータを、書くときにどのような位置に書きたいと思います。また、ReadメソッドMemoryMappedViewAccessor内のデータを読み取るために使用されます。

 

メモリマップトファイルmemoryFile = MemoryMappedFile.CreateFromFile(" Text.Config "、FileMode.OpenOrCreate、" 構成"1400年)。// キロバイト; 
MemoryMappedViewAccessorアクセサ= memoryFile.CreateViewAccessor(01024 )。
accessor.Write(0' 2 ')。

  同じプロセスでは、あなたはこのようにすべての変更が書き込まれていることを確認するオペレーティングシステムでこれらのオブジェクトを閉じると同時に、同じファイルのさまざまな部分を変更できるように、同じメモリマップドファイルに対して複数の「アクセス・メモリ・マップドビューオブジェクト」を作成することができます元のファイルに。

  MemoryMappedViewAccessor読み書きが一般的な方法を持って、プログラム中の構造タイプの唯一のシングルタイプ(アプリケーションタイプは、コンピュータがメモリマップドファイルに書き込まれるデータのバイト数を知ることができない実行されている、マネージヒープにあるオブジェクト参照の種類、そのサイズを計算)、サウンドメモリマップファイルの効率を通過する必要がありますが、非常に時間がかかる(とオブジェクトを参照することができる他のオブジェクト)。
  シリアライゼーション後にメモリ・マップ・ファイルに書き込まれたデータをシリアル化するために、参照オブジェクトを使用することができます。
メモリマップトファイルmemoryFile = MemoryMappedFile.CreateFromFile(" Text.Config "、FileMode.OpenOrCreate、" 構成"1400年)。// キロバイト; 
MemoryMappedViewStreamストリーム= memoryFile.CreateViewStream()。
MyPic OBJ = 新しいMyPic(); 
stream.Seek(0 、SeekOrigin.Begin)。
にBinaryFormatter()(OBJ、ストリーム)をシリアル化。

図4は、導管を介してWCFプロセス通信を使用して実装しました

  「パイプ(パイプ)は、」Windowsは、プロセス間通信機構は、互いに2つのプロセス間でデータを送信するために提供されます。(名前付きパイプ)名前付きパイプ、匿名パイプ(匿名パイプ):Windowsは、パイプの2種類を提供します

  1. 匿名パイプは:名前がないので、一方向のみの通信を許可し、その子プロセスを作成することによって、子プロセスへの匿名のパイプハンドルの代わりに転送、子プロセスを担当していたときに通信するために、2つのプロセスは親子関係、親プロセスでなければなりません親プロセスハンドルデータ伝送を取得します。利点は、小さなフットプリント、高効率であり、欠点は、通信プロセスが使用シナリオを制限し、親子関係でなければならないことです。
  2. 名前付きパイプ:マシン内のパイプのこのタイプは、固有の名前があり、サービスプロセスと複数のクライアントプロセス間のシングル/双方向通信のために使用することができます。名前付きパイプは、メッセージベースの通信モード、すなわち、他のプロセスに再びメッセージが連続して発生し得るプロセス(メッセージ間の区切り文字で分割メッセージ)、デリミタによって完了メッセージの受信者を抽出しています。

  System.IO.Pipesは名前空間で、一部の匿名のパイプラインは、このようなAnonymousPipeClientStreamやAnonymousPipeServerStreamなどに基づくプロセス間通信を使用することができ、パイプラインの実現を達成するため提供していますが、NamedPipeClientStreamとNamedPipeServerStreamは、名前付きパイプを達成することができます。しかし、WCFパイプラインプロセス通信簡単かつより柔軟、より複雑であるWCFに比べ。

  名前付きパイプを使用して、WCFアプリケーションは、プロセス間通信を達成するために:WCFはNetNamedPipeBindingバインディング提供は、形成プロセス通信に名前付きパイプを使用して達成することができます。

 

 

おすすめ

転載: www.cnblogs.com/pilgrim/p/11285218.html