IPC simple entre .net y .core
Esta es una luz de luz de un IPC que se utilizará en .NET o .core e incluso mezclado si lo desea. La "solución" para la conversión es un truco y podría no funcionar para lanzamientos posteriores.
En cuanto al 20.09.2020, funciona como se esperaba entre NetStandard 2.0 y .NET 4.7.2.
La clase se basa en KrakenIPC: https://github.com/darksody/krakenipc y tuberías dúplex completas: https://www.codeproject.com/articles/1179195/full-duplex-asynchronous-read-write-withamed-namedpip
Tenía una aplicación ASP.core que necesitaba obtener datos de una aplicación .NET472 y el único IPC que realmente funcionó fue GRPC (https://grpc.io/). GRPC fue exagerado para mi proyecto, así que quería algo más simple y pequeño.
Se agregó un retraso personalizado para el tiempo para esperar los datos del servidor para el cliente. Método de retorno cambiado para lanzar una excepción en lugar de NULL, para que sea más fácil manejar los tiempos de espera en el futuro. También se agrega un evento, para asegurarse de que atrapa todo si decide suprimir las excepciones.
El servidor y el cliente deben compartir una interfaz común.
public interface ISimple
{
int Number { get ; }
string Text { get ; }
}El servidor contiene los datos en la interfaz, aquí presentados como valores estáticos. Puede usar los tipos de datos más comunes; int, string, char, float, doble, largo, etc.
public class Simple : ISimple
{
public int Number { get => 111 ; }
public string Text { get => "Some string" ; }
}Ahora cree el servidor, todo lo que necesita es el nombre de canal. Tenga en cuenta que esta tubería solo funciona en localhost
try
{
//Then create server
var handler = new SimpleCrossFrameworkIPC . Server < Simple , ISimple > ( ) ;
handler . Start ( "Channel" ) ;
//Pause for clients
Console . ReadLine ( ) ;
//Stop server
handler . Stop ( ) ;
}
catch ( Exception ex )
{
Console . WriteLine ( ex . ToString ( ) ) ;
}Cuando un cliente se conecta, se referirá a la misma interfaz. Después de que la conexión se use para recibir datos del servidor
int nWaitForServerDataDelay = 2000 ; //2 sec max waiting for data
var client = new SimpleCrossFrameworkIPC . Client < IMySimpleService > ( nWaitForServerDataDelay ) ;
try
{
//Connect with a 1 second connection timeout
client . Connect ( "Channel" , 1000 ) ;
var proxy = client . GetProxy ( ) ;
//Print proxy-data to the console
Console . WriteLine ( "Text: " + proxy . Text ) ;
Console . WriteLine ( "Number: " + proxy . Number . ToString ( ) ) ;
}
catch ( Exception ex )
{
Console . WriteLine ( ex . ToString ( ) ) ;
}ExceptionHandling se necesita para la PipeConnection lanza un "Timout de conexión" y otros errores.
Nunca he usado esta clase para clases complejas y es desconocido para esto.
public event EventHandler < EventArgs > ClientConnected ;
public event EventHandler < EventArgs > ClientDisconnected ; void Start ( string Pipename )
void Stop ( )
public T GetProxy ( ) public event EventHandler < EventArgs > ClientDisconnected ; void Connect ( string Pipename )
void Connect ( string Pipename , int Timeout )
public void Disconnect ( )
public bool IsConnected ( )
void UseProxy ( Action < T > callback )
public T GetProxy ( ) Cualquier contribución es bienvenida :)