A IFormatter interface for serialization/deserialization
$ dotnet add package H.FormattersA simple, easy to use, strongly-typed, async wrapper around .NET named pipes.
client.WriteAsync, if necessaryPipeAccessRule's(see H.Pipes.AccessControl nuget package) or more complex code to access using the PipeServer.PipeStreamInitializeAction property// All clients and servers that do not need support AccessControl.
Install-Package H.Pipes
// Servers that need support AccessControl.
Install-Package H.Pipes.AccessControl
// If you want to transfer any data that can be serialized/deserialized in json using Newtonsoft.Json.
Install-Package H.Formatters.Newtonsoft.Json
// If you want to transfer any data that can be serialized/deserialized in json using System.Text.Json.
Install-Package H.Formatters.System.Text.Json
// If you want to transfer any data that can be serialized/deserialized in binary using Ceras.
Install-Package H.Formatters.Ceras
Server:
await using var server = new PipeServer<MyMessage>(pipeName);
server.ClientConnected += async (o, args) =>
{
Console.WriteLine($"Client {args.Connection.PipeName} is now connected!");
await args.Connection.WriteAsync(new MyMessage
{
Text = "Welcome!"
});
};
server.ClientDisconnected += (o, args) =>
{
Console.WriteLine($"Client {args.Connection.PipeName} disconnected");
};
server.MessageReceived += (sender, args) =>
{
Console.WriteLine($"Client {args.Connection.PipeName} says: {args.Message}");
};
server.ExceptionOccurred += (o, args) => OnExceptionOccurred(args.Exception);
await server.StartAsync();
await Task.Delay(Timeout.InfiniteTimeSpan);P.S. To use the server inside the WinForms application, use Task.Run(). This creates a new thread for it.
Client:
await using var client = new PipeClient<MyMessage>(pipeName);
client.MessageReceived += (o, args) => Console.WriteLine("MessageReceived: " + args.Message);
client.Disconnected += (o, args) => Console.WriteLine("Disconnected from server");
client.Connected += (o, args) => Console.WriteLine("Connected to server");
client.ExceptionOccurred += (o, args) => OnExceptionOccurred(args.Exception);
await client.ConnectAsync();
await client.WriteAsync(new MyMessage
{
Text = "Hello!",
});
await Task.Delay(Timeout.InfiniteTimeSpan);Since BinaryFormatter is used by default, you should check out this article: https://docs.microsoft.com/en-us/dotnet/standard/serialization/binaryformatter-security-guide
Install-Package H.Formatters.Newtonsoft.Json
Install-Package H.Formatters.System.Text.Json
Install-Package H.Formatters.Ceras
using H.Formatters;
await using var server = new PipeServer<MyMessage>(pipeName, formatter: new NewtonsoftJsonFormatter());
await using var client = new PipeClient<MyMessage>(pipeName, formatter: new NewtonsoftJsonFormatter());Install-Package H.Pipes.AccessControl
using System.IO.Pipes;
using H.Pipes.AccessControl;
await using var server = new PipeServer<string>(pipeName);
// You can set PipeSecurity
var pipeSecurity = new PipeSecurity();
pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow));
server.SetPipeSecurity(pipeSecurity);
// or just add AccessRule's (Please be careful, the server will only consider AccessRules from the last call AddAccessRules())
server.AddAccessRules(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow));
// or just
server.AllowUsersReadWrite();Install-Package H.Formatters.Inferno
using H.Formatters;
await using var server = new PipeServer<MyMessage>(pipeName, formatter: new SystemTextJsonFormatter());
server.EnableEncryption();
await using var client = new PipeClient<MyMessage>(pipeName, formatter: new SystemTextJsonFormatter());
client.EnableEncryption();server.ClientConnected += async (o, args) =>
{
var name = args.Connection.GetImpersonationUserName();
Console.WriteLine($"Client {name} is now connected!");
};I recommend that you take a look at my other library if you plan on doing IPC.
It is based on this library, but provides an IPC implementation based on C# interfaces.
It supports remote method invocation, asynchronous methods, cancellation via CancellationToken, events, and so on.