Como: Usar pipes anônimo para comunicação entre processos locais
Pipes anônimos oferecem menos funcionalidade que pipes nomeados, mas também exigem menos sobrecarga.Você pode usar pipes anônimos para tornar a comunicação entre processos mais fácil.Não é possível usar pipes anônimos para comunicação através de uma rede.
Exemplo
O exemplo a seguir demonstra uma maneira para enviar uma sequência de caracteres de um processo pai para um processo filho usando pipes anônimos.Este exemplo cria um objeto AnonymousPipeServerStream em um processo pai com um valor PipeDirection de Out.O processo pai, em seguida, cria um processo filho usando um identificador de cliente para criar um objeto AnonymousPipeClientStream.O processo filho tem um valor PipeDirection de In.
O processo pai, em seguida, envia uma sequência de caracteres fornecida pelo usuário para o processo filho.A sequência é exibida ao console no processo filho.
O exemplo a seguir mostra a processo do servidor.
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();
}
}
O exemplo a seguir mostra a processo do cliente.O processo do servidor inicia o processo do cliente e oferece a esse processo um identificador de cliente.O executável resultante a partir de código do cliente deve ser nomeado pipeClient.exe e ser copiado para o mesmo diretório que o servidor executável antes de executar o processo do servidor.
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();
}
}
Consulte também
Tarefas
Como: Uso Named Pipes para comunicação entre processos através de uma rede