IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Pipe de communication entre C++ et C#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Par défaut Pipe de communication entre C++ et C#
    Bonjour,

    J'ai une dll écrite en C++ qui prend en paramètre un handle de pipe pour écrire des infos dans un pipe de communication.
    J'avais une autre dll en C++ qui faisait la création et la lecture du pipe. J'ai besoin de réécrire cette partie dans une dll C#, j'ai donc tenté d'utiliser les NamedPipeStream:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class Pipe
    {
    	private NamedPipeServerStream pipeServer;
    	public Pipe()
    	{
    		pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut);
                 }
     
                  public string Handle
    	{
    		get{return pipeServer.SafePipeHandle.DangerousGetHandle().ToString();}
                 }
     
                  public void Read()
    	{
    		using(NamedPipeClientStream pipeClient =new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut))
    		{
     
    			Console.Write("Attempting to connect to pipe...");
    			pipeClient.Connect();
                                          Console.WriteLine("Connected to pipe.");
    								                          using(StreamReader sr = new StreamReader(pipeClient))
    			{								            string temp;
    				while((temp = sr.ReadLine()) != null)
    				{
    							Console.WriteLine("Received from server: {0}", temp);
    				}
     
    			}
     
    		}
                 }
    }
    Je passe le handle à ma dll C++ qui semble bien écrire dans le pipe. J'appelle la méthode Read dans un thread , mais je ne récupère rien lors de la lecture

    Est ce que ma méthode vous semble correcte? y'a t'il un obstacle à ce que la dll C++ écrive dans le pipe C#?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Par défaut
    J'ai réussi à écrire dans le pipe depuis la dll C++ et à lire dans le pipe depuis la dll C#, mais il faut un thread qui écrit en permanence dans le pipe dans la dll C# pour que cela fonctionne!!

    Fonction d'écriture dans le pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public void Write()
    {
    	pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut);
    	pipeServer.WaitForConnection();
    	bConnected = true;
    	try
    	{
    		using(StreamWriter sw = new StreamWriter(pipeServer))
    	            {
    			while(!bStop)
    			{
    				sw.AutoFlush = true;
                                                        // Sans cette ligne cela ne marche pas
    				sw.WriteLine("");
    											}
    		}
    	}
    	catch(Exception e)
    	{
    	             Console.Write(e.Message);
    	}
    }
    Fonction de lecture dans le pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public void Read()
    {
     
    	pipeClient = new NamedPipeClientStream(".", "testpipe", PipeDirection.In);
    	pipeClient.Connect();
     
     
    	using(StreamReader sr = new StreamReader(pipeClient))
    	{
    		while(!bStop)
    		{
    			string temp;
    			while((temp = sr.ReadLine()) != null)
    			{
    				Console.WriteLine("Read in pipe: {0}", temp);
    			}
    		}
    	}
    }
    Création des threads :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Pipe pPipe = new Pipe();
    Thread tThreadWritePipe = new Thread(pPipe.Write);
    tThreadWritePipe.Start();
    Thread tThreadReadPipe = new Thread(pPipe.Read);
    tThreadReadPipe.Start();
    Handle du pipe utilisé par le c++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public string Handle
    {
    	get{
     
    	return pipeServer.SafePipeHandle.DangerousGetHandle().toString();
    	}
    }
    Code C++ écrivant dans le pipe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CFile m_file;
    this->m_file.m_hFile = hPipe;
    this->m_file.Write(csNewString, csNewString.GetLength());
    this->m_file.Flush();
    Donc tout cela fonctionne tant que le thread d'écriture coté C#, écrit dans le pipe. Si j'enlève l'instruction je ne lis plus rien dans le pipe alors que la dll C++ écrit toujours dans le pipe.

    Est ce que quelqu'un aurait une idée?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Par défaut
    Quel con!!!!

    J'avais oublié que ma dll C++ n'écrivait pas de caractère fin de ligne donc forcément la méthode ReadLine pour lire dans le pipe attendait que le thread d'écriture ajoute le caractère fin de ligne.

    Donc en utilisant la méthode ReadBlock au lieu de ReadLine, la dll C# n'a pu besoin d'écrire dans le pipe.

    Merci pour votre non aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. communication entre deux executables
    Par semenzato dans le forum MFC
    Réponses: 8
    Dernier message: 13/04/2005, 22h19
  2. Lecture standard et communication entre processus!
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/07/2003, 16h37
  3. Communication entre processus
    Par markopolo dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/06/2003, 16h21
  4. Réponses: 5
    Dernier message: 25/03/2003, 19h43
  5. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo