web-dev-qa-db-ja.com

2つのC#プロセス間のプロセス間通信の最も簡単な方法は何ですか?

両方ともC#で記述された親プロセスと子プロセスの間で通信したい。非同期のイベント駆動型でなければなりません。非常にまれな通信を処理するすべてのプロセスでスレッドを実行する必要はありません。

それに最適なソリューションは何ですか?

53
Horcrux7

匿名パイプ

BeginRead/BeginWriteおよびAsyncCallbackで非同期操作を使用します。

37

同じコンピューターでプロセスを実行する場合は、単にstdioを使用できます。

これは私の使用法です、ウェブページのスクリーンシューター:

var jobProcess = new Process();

jobProcess.StartInfo.FileName = Assembly.GetExecutingAssembly().Location;
jobProcess.StartInfo.Arguments = "job";

jobProcess.StartInfo.CreateNoWindow = false;
jobProcess.StartInfo.UseShellExecute = false;

jobProcess.StartInfo.RedirectStandardInput = true;
jobProcess.StartInfo.RedirectStandardOutput = true;
jobProcess.StartInfo.RedirectStandardError = true;

// Just Console.WriteLine it.
jobProcess.ErrorDataReceived += jp_ErrorDataReceived;

jobProcess.Start();

jobProcess.BeginErrorReadLine();

try
{
    jobProcess.StandardInput.WriteLine(url);
    var buf = new byte[int.Parse(jobProcess.StandardOutput.ReadLine())];
    jobProcess.StandardOutput.BaseStream.Read(buf, 0, buf.Length);
    return Deserz<Bitmap>(buf);
}
finally
{
    if (jobProcess.HasExited == false)
        jobProcess.Kill();
}

メインで引数を検出

static void Main(string[] args)
{
    if (args.Length == 1 && args[0]=="job")
    {
        //because stdout has been used by send back, our logs should put to stderr
        Log.SetLogOutput(Console.Error); 

        try
        {
            var url = Console.ReadLine();
            var bmp = new WebPageShooterCr().Shoot(url);
            var buf = Serz(bmp);
            Console.WriteLine(buf.Length);
            System.Threading.Thread.Sleep(100);
            using (var o = Console.OpenStandardOutput())
                o.Write(buf, 0, buf.Length);
        }
        catch (Exception ex)
        {
            Log.E("Err:" + ex.Message);
        }
    }
    //...
}
15
IlPADlI

Windows Communication Foundationを使用することをお勧めします。

http://en.wikipedia.org/wiki/Windows_Communication_Foundation

オブジェクトをやり取りしたり、さまざまなプロトコルを使用したりできます。バイナリtcpプロトコルを使用することをお勧めします。

8
bobwienholt
5
Amy B

MSMQ(Microsoft Message Queueing)もあります。これは、ネットワーク全体およびローカルコンピューター上で動作できます。通信するためのより良い方法がありますが、調べる価値があります: https://msdn.Microsoft.com/en-us/library/ms711472(v = vs.85).aspx

1
Rowan

[〜#〜] com [〜#〜] もあります。

技術はありますが、定義できるメソッドを呼び出すことができるという利点があると思います。

MSDNは、C#COM相互運用チュートリアルを提供しています。これらのリンクは変更されるため、検索してください。

すぐに始めましょう here ...

1
Kay Zed

セキュリティが懸念されておらず、制約(同じマシン上の2つのC#プロセス)が与えられている場合のプロセス間通信のためのC#のeasiestソリューションはRemotingですAPI。現在、Remotingはレガシーテクノロジー(非推奨とは異なります)であり、新しいプロジェクトでの使用は推奨されていませんが、うまく機能し、動作するために多くの威力と環境を必要としません。

RemotingフレームワークのクラスIpcChannel を使用するためのMSDNの優れた記事があります( Greg Beech for the find here )リモートサーバーとクライアント。

最初にこのアプローチを試してから、コードをWCF(Windows Communication Framework)に移植してみることをお勧めします。これにはいくつかの利点(セキュリティの向上、クロスプラットフォーム)がありますが、必然的に複雑になります。幸いなことに、MSDNには RemotingからWCFへのコードの移植に関する非常に優れた記事 があります。

WCFには素晴らしいチュートリアルがあります ですぐに飛び込みたい場合。

0
cdiggins