Einfacher IPC zwischen .net und .core
Dies ist eine Lichtversion eines IPC, das entweder auf .NET oder auf .core verwendet und sogar gemischt werden soll, wenn Sie möchten. Das "Fix" für die Konvertierung ist ein Hack und funktioniert möglicherweise nicht für spätere Veröffentlichungen.
Wie für 20.09.2020 funktioniert es wie erwartet zwischen NetStandard 2.0 und .NET 4.7.2.
Die Klasse basiert auf Krakenipc: https://github.com/darksody/krakenipc und vollständige Duplex-Pipes: https://www.codeprroject.com/articles/1179195/full-duplex-asynchronous-read-with-named-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-pip-Pip-Pip-Pip-Pip-Pip-Pip-Pip-Pip-
Ich hatte eine ASP.Core -Anwendung, die Daten von einer .NET472 -Anwendung abrufen musste, und der einzige IPC, der tatsächlich arbeitete, war GRPC (https://grpc.io/). GRPC war für mein Projekt übertrieben, also wollte ich etwas einfacheres und kleines.
Eine benutzerdefinierte Verzögerung für die Zeit hinzugefügt, um auf Serverdaten für den Client zu warten. Änderung der Rückkehrmethode, um eine Ausnahme anstelle von NULL auszulegen, um in Zukunft Zeitüberschreitungen zu erleichtern. Es wird auch eine Veranstaltung hinzugefügt, um sicherzustellen, dass Sie alles fangen, wenn Sie sich entscheiden, Ausnahmen zu unterdrücken.
Server und Client müssen eine gemeinsame Schnittstelle teilen.
public interface ISimple
{
int Number { get ; }
string Text { get ; }
}Der Server enthält die Daten in der Schnittstelle, die hier als statische Werte dargestellt werden. Sie können die häufigsten Datentypen verwenden. int, String, char, float, doppelt, lang usw. ...
public class Simple : ISimple
{
public int Number { get => 111 ; }
public string Text { get => "Some string" ; }
}Erstellen Sie nun den Server, alles, was er benötigt, ist der ChannelName. Beachten Sie, dass diese Pfeife nur auf Localhost funktioniert
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 ( ) ) ;
}Wenn ein Client eine Verbindung herstellt, bezieht sich dies auf dieselbe Schnittstelle. Nach der Verbindung werden Daten vom Server empfangen
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 ( ) ) ;
}Für die PipeConnection wird ein Ausnahmehandling benötigt, um eine "Verbindung Timout" und andere Fehler zu erzielen.
Ich habe diese Klasse noch nie für komplexe Klassen verwendet und die Unterstützung dafür ist unbekannt.
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 ( ) Jeder Beitrag ist willkommen :)