web-dev-qa-db-fra.com

Quelle est la méthode la plus simple de communication inter-processus entre 2 processus C #?

Je souhaite communiquer entre un processus parent et un processus enfant écrit en C #. Il devrait être asynchrone, piloté par les événements. Je ne veux pas exécuter un thread dans chaque processus qui gère la communication très rare.

Quelle est la meilleure solution pour cela?

48
Horcrux7

Pipes anonymes.

http://msdn.Microsoft.com/en-us/library/bb546102.aspx

Utilisez des opérations asynchrones avec BeginRead/BeginWrite et AsyncCallback.

32
Carlos A. Ibarra

Si vos processus sont dans le même ordinateur, vous pouvez simplement utiliser stdio .

Ceci est mon usage, un écran de page Web:

        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();
        }

Détecter les arguments sur Main

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);
        }
    }
    //...
}
13
IlPADlI

Je suggérerais d'utiliser Windows Communication Foundation:

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

Vous pouvez passer des objets dans les deux sens, utiliser divers protocoles. Je suggère d'utiliser le protocole TCP binaire.

8
bobwienholt
5
Amy B

Il existe également MSMQ (Microsoft Message Queuing) qui peut fonctionner sur des réseaux ainsi que sur un ordinateur local. Bien qu'il existe de meilleures façons de communiquer, il est intéressant de regarder dans: https://msdn.Microsoft.com/en-us/library/ms711472(v=vs.85).aspx

1
Rowan

Il y a aussi COM .

Il y a des aspects techniques, mais je dirais que l'avantage est que vous pourrez appeler des méthodes que vous pouvez définir.

MSDN propose des didacticiels d'interopérabilité COM C #. S'il vous plaît chercher parce que ces liens changent.

Pour commencer tout de suite, allez ici ...

1
Kay Zed

La solution easiest en C # pour la communication inter-processus lorsque la sécurité ne vous préoccupe pas et compte tenu de vos contraintes (deux processus C # sur le même ordinateur) est l'API Remoting. Remoting est une technologie existante (différente de celle recommandée) et non recommandée à une utilisation dans de nouveaux projets, mais elle fonctionne bien et ne nécessite pas beaucoup de faste et de circonstances pour fonctionner. 

Il existe un excellent article sur MSDN pour l'utilisation de la classe IpcChannel du cadre Remoting (crédit de Greg Beech pour la recherche ici ) pour la configuration d'un serveur et d'un client remoting simples.

Je suggérerais d'essayer d'abord cette approche, puis d'essayer de porter votre code au format WCF (Windows Communication Framework). Ce qui présente plusieurs avantages (meilleure sécurité, multiplate-forme), mais est nécessairement plus complexe. Heureusement, MSDN a un très bon article pour le code de portage de Remoting to WCF .

Si vous voulez plonger tout de suite avec WCF, vous y trouverez un excellent tutoriel } _.

0
cdiggins