I tried to use anonymous pipes in C#, but it fails even with the most basic example. Here's the server console app:
namespace Server
{
using System;
using System.Diagnostics;
using System.IO.Pipes;
public static class Program
{
public static void Main()
{
using (var pipe = new AnonymousPipeServerStream(PipeDirection.In))
{
var pipeName = pipe.GetClientHandleAsString();
var startInfo = new ProcessStartInfo("Client.exe", pipeName);
startInfo.UseShellExecute = false;
using (var process = Process.Start(startInfo))
{
pipe.DisposeLocalCopyOfClientHandle();
var receivedByte = pipe.ReadByte();
Console.WriteLine(
"The client sent the following byte: " + receivedByte);
process.WaitForExit();
}
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true);
}
}
}
And here is the source code of the console client app:
namespace Client
{
using System.IO.Pipes;
public static class Program
{
public static void Main(string[] args)
{
using (var pipe = new AnonymousPipeClientStream(
PipeDirection.Out, args[0]))
{
pipe.WriteByte(0x65);
}
}
}
}
When I launch the server, the client app crashes (with Windows "Client has stopped working" dialog). The server displays:
The client sent the following byte: -1
Unhanded Exception: System.IO.IOException: Invalid pipe handle.
at […]
at Client.program.Main(String[] args) in C:\[…]\Client\Program.cs:line 9
What am I doing wrong?
Found it. Instead of:
new AnonymousPipeServerStream(PipeDirection.In)
it should be:
new AnonymousPipeServerStream(PipeDirection.In, HandleInheritability.Inheritable)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With