3

単純なプロセスとして実行され、他のアプリケーションにxmlストリームを送信する可能性を与えるサービスを作成したいと思います。

私が言いたいのは、無限ループで単純なプロセス(exe)を作成することです-そして、どのアプリケーションもこのプロセスにXML(ファイル/ストリーム)を送信できます=>そしてこのプロセスはxmlをいくつかのソケットに送信します。

パイプなしでそれを行うことは可能ですか?COMのようなことをしたい-作業プロセスのインスタンスを「キャッチ」できる。

4

4 に答える 4

5

もちろん。

名前付きパイプクラスはC#で使用できます:

サーバー:

using (var s = new NamedPipeServerStream ("myPipe"))
{
 s.WaitForConnection();
 s.WriteByte (100);
 Console.WriteLine (s.ReadByte());
}

クライアントコード:

using (var s = new NamedPipeClientStream ("myPipe"))
{
 s.Connect();
 Console.WriteLine (s.ReadByte());
 s.WriteByte (200);  
}

編集

あなたはファイルでそれを行うことができます。+systemfileWatcherクラス

ファイルをフォルダに入れます。

他のプロセスはこのフォルダを監査します。

そして今、あなたは情報を転送することができます。

edit2

memoryMappedFileを使用できます

各プロセスでビューを開いて、同じメモリ領域を表示し、データを転送します。最高だと思います。

プロセスA:

 static void Main(string[] args)
        {
            using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 4000))
            {
                bool mutexCreated;
                Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
                using (MemoryMappedViewStream stream = mmf.CreateViewStream())
                {
                    BinaryWriter writer = new BinaryWriter(stream);
                    string st = "Hellow";
                    int stringSize = Encoding.UTF8.GetByteCount(st); //6
                    writer.Write(st);
                    writer.Write(123); //6+4 bytes = 10 bytes
                }
                mutex.ReleaseMutex();
                Console.WriteLine("Start Process B and press ENTER to continue.");
                Console.ReadLine();
                mutex.WaitOne();
                using (MemoryMappedViewStream stream = mmf.CreateViewStream())
                {
                    BinaryReader reader = new BinaryReader(stream);
                    Console.WriteLine("Process  A  says: {0}", reader.ReadString());
                    Console.WriteLine("Process  A says: {0}", reader.ReadInt32());
                    Console.WriteLine("Process  B says: {0}", reader.ReadInt32());
                }
                mutex.ReleaseMutex();
            }
        }

プロセスBはその領域に書き込みます

 static void Main(string[] args)
        {
            try
            {
                using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
                {
                    Mutex mutex = Mutex.OpenExisting("testmapmutex");
                    mutex.WaitOne();
                    using (MemoryMappedViewStream stream = mmf.CreateViewStream(11, 0)) // From the 11 byte....
                    {
                        BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8);
                        writer.Write(2);
                    }
                    mutex.ReleaseMutex();
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Memory-mapped file does not exist. Run Process A first.");
            }
        }
于 2012-04-30T21:30:55.390 に答える
4

他のプロセスからの接続をリッスンし、カスタムXMLファイルレシーバーを作成するC#ソケットを使用するだけです。

于 2012-04-30T21:31:04.227 に答える
3

はい、もちろん、TCPソケット接続を使用できます。コメントで説明されているようにネットワーク接続を回避したい場合は、たとえばメモリマップトファイルを使用した共有メモリアプローチを使用できます。

于 2012-04-30T21:30:41.793 に答える
2

あなたが探しているのは、ある種のIPC(プロセス間通信)です。非常に多くの可能性があります:

  1. 通常のファイル。Windowsは、一時ファイル専用の場所を提供します(%TEMP%)
  2. 小さなデータの場合、レジストリを使用できますが、ほとんどの場合、適切な使用法ではありません。
  3. メモリマップトファイル、ファイルに似ていますが、RAMにあります
  4. Royiが適切に述べたように、NamedPipeStreamは、パイプを試してみることにした場合に行く方法です。
  5. WCFエンドポイントを作成できます。ドラッグのように聞こえますが、Visual Studioによってすべての足場が作成されるため、最終的にはそのような問題にはなりません。
  6. フォームアプリケーションを開発している場合はウィンドウメッセージを使用できますが、そうでない場合もあります。
  7. データはXMLであるとおっしゃっていたので、この方法論は適していませんが、とにかくお話しします。ミューテックス、イベント、セマフォなどの名前付きカーネルオブジェクトを使用して、あるプログラムから別のプログラムに信号を渡すことができます。
于 2012-04-30T21:39:29.957 に答える