Comment : utiliser des canaux anonymes pour la communication entre processus locaux
Mise à jour : novembre 2007
Les canaux anonymes proposent moins de fonctionnalités que les canaux nommés, mais ils nécessitent moins de charge mémoire. Vous pouvez utiliser des canaux anonymes pour faciliter la communication entre processus sur un ordinateur local. Vous ne pouvez pas utiliser de canaux anonymes pour la communication sur un réseau.
Exemple
Une méthode permettant d'envoyer une chaîne d'un processus parent à un processus enfant à l'aide de canaux anonymes est illustrée dans l'exemple suivant. Cet exemple crée un objet AnonymousPipeServerStream dans un processus parent dont un PipeDirection a la valeur Out. Le processus parent crée ensuite un processus enfant à l'aide d'un handle client en vue de générer un objet AnonymousPipeClientStream. Le processus enfant possède un PipeDirection dont la valeur est In.
Le processus parent envoie ensuite une chaîne fournie par utilisateur au processus enfant. La chaîne s'affiche sur la console dans le processus enfant.
L'exemple suivant indique le processus serveur.
Imports System
Imports System.IO
Imports System.IO.Pipes
Imports System.Diagnostics
Class PipeServer
Shared Sub Main()
Dim pipeClient As New Process()
pipeClient.StartInfo.FileName = "pipeClient.exe"
Using pipeServer As New AnonymousPipeServerStream( _
PipeDirection.Out, HandleInheritability.Inheritable)
Console.WriteLine("Current TransmissionMode: {0}.", _
pipeServer.TransmissionMode)
'Anonymous pipes do not support Message mode.
Try
Console.WriteLine("Setting ReadMode to 'Message'.")
pipeServer.ReadMode = PipeTransmissionMode.Message
Catch e As Exception
Console.WriteLine("EXCEPTION: {0}", e.Message)
End Try
' Pass the client process a handle to the server
pipeClient.StartInfo.Arguments = _
pipeServer.GetClientHandleAsString()
pipeClient.StartInfo.UseShellExecute = False
pipeClient.Start()
pipeServer.DisposeLocalCopyOfClientHandle()
Try
'Read user input and send that to the client process.
Using sw As New StreamWriter(pipeServer)
sw.AutoFlush = True
Console.Write("Enter text: ")
sw.WriteLine(Console.ReadLine())
End Using
Catch e As Exception
Console.WriteLine("ERROR: {0}", e.Message)
End Try
pipeClient.WaitForExit()
pipeClient.Close()
End Using
End Sub
End Class
using System;
using System.IO;
using System.IO.Pipes;
using System.Diagnostics;
class PipeServer
{
static void Main()
{
Process pipeClient = new Process();
pipeClient.StartInfo.FileName = "pipeClient.exe";
using (AnonymousPipeServerStream pipeServer =
new AnonymousPipeServerStream(PipeDirection.Out,
HandleInheritability.Inheritable))
{
Console.WriteLine("Current TransmissionMode: {0}.",
pipeServer.TransmissionMode);
// Anonymous pipes do not support Message mode.
try
{
Console.WriteLine("Setting ReadMode to \"Message\".");
pipeServer.ReadMode = PipeTransmissionMode.Message;
}
catch (NotSupportedException e)
{
Console.WriteLine("EXCEPTION: {0}", e.Message);
}
// Pass the client process a handle to the server.
pipeClient.StartInfo.Arguments =
pipeServer.GetClientHandleAsString();
pipeClient.StartInfo.UseShellExecute = false;
pipeClient.Start();
pipeServer.DisposeLocalCopyOfClientHandle();
try
{
// Read user input and send that to the client process.
using (StreamWriter sw = new StreamWriter(pipeServer))
{
sw.AutoFlush = true;
Console.Write("Enter text: ");
sw.WriteLine(Console.ReadLine());
}
}
// Catch the IOException that is raised if the pipe is broken
// or disconnected.
catch (IOException e)
{
Console.WriteLine("ERROR: {0}", e.Message);
}
}
pipeClient.WaitForExit();
pipeClient.Close();
}
}
L'exemple suivant indique le processus client. Le processus serveur démarre le processus client et donne un handle client à ce processus. Vous devez nommer l'exécutable résultant du code client pipeClient.exe et le copier dans le même répertoire que l'exécutable du serveur avant d'exécuter le processus serveur.
Imports System
Imports System.IO
Imports System.IO.Pipes
Class PipeClient
Shared Sub Main(ByVal args As String())
If (args.Length > 0) Then
Using pipeClient As New AnonymousPipeClientStream( _
PipeDirection.In, args(0))
Console.WriteLine("Current TransmissionMode: {0}.", _
pipeClient.TransmissionMode)
' Anonymous Pipes do not support Message mode.
Try
Console.WriteLine("Setting ReadMode to 'Message'.")
pipeClient.ReadMode = PipeTransmissionMode.Message
Catch e As NotSupportedException
Console.WriteLine("EXCEPTION: {0}", e.Message)
End Try
Using sr As New StreamReader(pipeClient)
' Display the read text to the console
Dim temp As String
temp = sr.ReadLine()
While Not temp = Nothing
Console.WriteLine(temp)
temp = sr.ReadLine()
End While
End Using
End Using
End If
Console.Write("Press Enter to continue...")
Console.ReadLine()
End Sub
End Class
using System;
using System.IO;
using System.IO.Pipes;
class PipeClient
{
static void Main(string[] args)
{
if (args.Length > 0)
{
using (PipeStream pipeClient =
new AnonymousPipeClientStream(PipeDirection.In, args[0]))
{
Console.WriteLine("Current TransmissionMode: {0}.",
pipeClient.TransmissionMode);
// Anonymous Pipes do not support Message mode.
try
{
Console.WriteLine("Setting ReadMode to \"Message\".");
pipeClient.ReadMode = PipeTransmissionMode.Message;
}
catch (NotSupportedException e)
{
Console.WriteLine("EXCEPTION: {0}", e.Message);
}
using (StreamReader sr = new StreamReader(pipeClient))
{
// Display the read text to the console
string temp;
while ((temp = sr.ReadLine()) != null)
{
Console.WriteLine(temp);
}
}
}
}
Console.Write("Press Enter to continue...");
Console.ReadLine();
}
}
Voir aussi
Tâches
Comment : utiliser des canaux nommés pour la communication entre processus sur un réseau