2010-09-30 6 views
3

Quelle serait la meilleure façon de communiquer entre un processus C et un processus C#? J'ai besoin d'envoyer des messages contenant des commandes et des paramètres et autres du processus C#. au processus C. et le processus C doit alors pouvoir envoyer des réponses.Comment communiquer entre une application C et une application C#

Je lance le processus C dans le processus C#.

Quel serait le meilleur moyen d'y parvenir? J'ai essayé d'utiliser stdin et stdout mais cela ne fonctionne pas bien (pour quelque raison le stdin du processus C est spammé avec une chaîne (x (U + 266C) Q) (U + 266C est un UTF8 beamed sixteen note)

+0

Il semble que vous avez un problème d'encodage, voir cette question: http://stackoverflow.com/questions/2855675/process-standardinput-encoding-problem – jmservera

Répondre

6

Est-ce que vous avez vraiment besoin de processus distincts Si vous possédez les deux codes pourquoi ne pas faire des appels interop en important les méthodes de la bibliothèque c:

class Program 
{ 
    [DllImport("yourlibrary.dll")] 
    public static extern int YourMethod(int parameter); 

    static void Main(string[] args) 
    { 
     Console.WriteLine(YourMethod(42)); 
    } 
} 

et dans votre bibliothèque C vous exportez votre méthode en utilisant un fichier .def:

LIBRARY "yourlibrary" 
    EXPORTS 
    YourMethod 
+0

A la fin il est apparu que nous pourrions simplement utiliser la bibliothèque que le code C utilisait en C#. Merci! –

0

Vos processus doivent être exécutés en parallèle ou vous démarrez processus final et besoin d'obtenir ses résultats? Si vous commencez simplement un processus fils, alors, comme indiqué dans le commentaire, vous n'effectuez pas la conversion UTF16-> ASCII des données transmises à l'application enfant.

Si vous devez exécuter des processus en parallèle et échanger des messages entre eux, jetez un coup d'œil à notre produit MsgConnect, conçu spécifiquement pour ces tâches.

3

Il semble que vous n'ayez pas accès au code source du programme C. J'utiliserais ProcessStartInfo pour lancer votre programme C externe. Mais avant de le faire, vous redirigez l'entrée/sortie. Voir l'exemple de code ci-dessous:

private void start() 
{ 
    Process p = new Process(); 
    StreamWriter sw; 
    StreamReader sr; 
    StreamReader err; 
    ProcessStartInfo psI = new ProcessStartInfo("cmd"); 
    psI.UseShellExecute = false; 
    psI.RedirectStandardInput = true; 
    psI.RedirectStandardOutput = true; 
    psI.RedirectStandardError = true; 
    psI.CreateNoWindow = true; 
    p.StartInfo = psI; 
    p.Start(); 
    sw = p.StandardInput; 
    sr = p.StandardOutput; 
    sw.AutoFlush = true; 
    if (tbComm.Text != "") 
     sw.WriteLine(tbComm.Text); 
    else 
     //execute default command 
     sw.WriteLine("dir \\"); 
    sw.Close(); 
    textBox1.Text = sr.ReadToEnd(); 
    textBox1.Text += err.ReadToEnd(); 
} 
+0

Merci. Comme il s'est avéré que nous pouvions ignorer complètement le programme C et utiliser la bibliothèque utilisée dans le programme C. Mais merci pour votre réponse, c'était très utile. –

Questions connexes