IPC simple entre .net et .Core
Il s'agit d'une lumière de la lumière d'un IPC à utiliser sur .NET ou .Core et même mélangé si vous le souhaitez. Le "correctif" pour la conversion est un hack et pourrait ne pas fonctionner pour les versions ultérieures.
Quant au 20.09.2020, il fonctionne comme prévu entre Netstandard 2.0 et .NET 4.7.2.
La classe est basée sur Krakinipc: https://github.com/darksody/krakenipc et pipes duplex complètes: https://www.codeproject.com/articles/1179195
J'avais une application ASP.Core qui devait obtenir des données à partir d'une application .NET472 et le seul IPC qui a réellement fonctionné était GRPC (https://grpc.io/). GRPC était exagéré pour mon projet, donc je voulais quelque chose de plus simple et de minuscule.
Ajout d'un délai personnalisé pour le temps pour attendre les données du serveur pour le client. Modification de la méthode de retour pour lancer une exception au lieu de Null, pour faciliter la gestion des délais d'attente à l'avenir. Un événement est également ajouté, pour vous assurer de tout attraper si vous décidez de supprimer les exceptions.
Le serveur et le client doivent partager une interface commune.
public interface ISimple
{
int Number { get ; }
string Text { get ; }
}Le serveur contient les données de l'interface, ici présentées sous forme de valeurs statiques. Vous pouvez utiliser les types de données les plus courants; int, String, Char, Float, Double, Long, etc ...
public class Simple : ISimple
{
public int Number { get => 111 ; }
public string Text { get => "Some string" ; }
}Créez maintenant le serveur, tout ce dont il a besoin est le nom de chaîne. Notez que ce tuyau ne fonctionne que sur 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 ( ) ) ;
}Lorsqu'un client se connecte, il se référera à la même interface. Une fois que la connexion est utilisée pour recevoir des données du serveur
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 ( ) ) ;
}La mendicité d'exception est nécessaire pour le PipPeconnection lance un "connexion TIMout" et d'autres erreurs.
Je n'ai jamais utilisé cette classe pour des classes complexes et le support est inconnu.
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 ( ) Toute contribution est la bienvenue :)