IPC simples entre .NET e .Core
Este é um LightVersion de um IPC a ser usado no .NET ou .Core e até misturado, se você quiser. A "correção" para a conversão é um hack e pode não funcionar para lançamentos posteriores.
Quanto a 20.09.2020, ele funciona como esperado entre o NetStandard 2.0 e o .NET 4.7.2.
A classe é baseada em krakenipc: https://github.com/darksody/krakenipc e tubos completos de duplex: https://www.codeproject.com/articles/1179195/full-duplex-asynchrons-write-with-namedpipipippippippip
Eu tinha um aplicativo asp.core que precisava obter dados de um aplicativo .NET472 e o único IPC que realmente funcionou foi o GRPC (https://grpc.io/). O GRPC estava exagerado para o meu projeto, então eu queria algo mais simples e pequeno.
Adicionado um atraso personalizado para o tempo para aguardar os dados do servidor para o cliente. Método de retorno alterado para lançar uma exceção em vez de nulo, para facilitar o manuseio de tempo limite no futuro. Além disso, um evento é adicionado, para garantir que você pegue tudo se decidir suprimir exceções.
Servidor e cliente precisam compartilhar uma interface comum.
public interface ISimple
{
int Number { get ; }
string Text { get ; }
}O servidor contém os dados na interface, aqui apresentados como valores estáticos. Você pode usar os tipos de dados mais comuns; int, string, char, flutuação, dupla, longa etc ...
public class Simple : ISimple
{
public int Number { get => 111 ; }
public string Text { get => "Some string" ; }
}Agora crie o servidor, tudo o que precisa é o nome do canal. Observe que este tubo funciona apenas no host local
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 ( ) ) ;
}Quando um cliente conecta, ele se refere à mesma interface. Após a conexão, são usados para receber dados do 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 ( ) ) ;
}A manipulação de exceções é necessária para a PipeConnection lança um "timut de conexão" e outros erros.
Eu nunca usei essa classe para classes complexas e suporte para isso é desconhecido.
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 ( ) Qualquer contribuição é bem -vinda :)