IPC بسيط بين .NET و .CORE
هذا هو إضاءة من IPC لاستخدامها على .NET أو .CORE وحتى مختلطة إذا أردت. "الإصلاح" للتحويل هو اختراق وقد لا يعمل للإصدارات اللاحقة.
بالنسبة إلى 20.09.2020 ، يعمل كما هو متوقع بين NetStandard 2.0 و .NET 4.7.2.
يعتمد الفصل على krakenipc: https://github.com/darksody/krakenipc وأنابيب الوجهين الكاملة: https://www.codeproject.com/articles/1179195/full-duplex-asynchronous-
كان لدي تطبيق ASP.CORE الذي يحتاج إلى الحصول على بيانات من تطبيق .NET472 و IPC الوحيد الذي عمل بالفعل هو GRPC (https://grpc.io/). كانت GRPC مبالغة في مشروعي ، لذا أردت شيئًا أبسط وصغيراً.
تمت إضافة تأخير مخصص للوقت لانتظار بيانات الخادم للعميل. تم تغيير طريقة الإرجاع لرمي استثناء بدلاً من NULL ، لتسهيل التعامل مع الموعد في المستقبل. كما تتم إضافة حدث ، لضمان التقاط كل شيء إذا قررت قمع الاستثناءات.
يحتاج الخادم والعميل إلى مشاركة واجهة مشتركة.
public interface ISimple
{
int Number { get ; }
string Text { get ; }
}يحتوي الخادم على البيانات الموجودة في الواجهة ، حيث تم تقديمها هنا كقيم ثابتة. يمكنك استخدام معظم أنواع البيانات الشائعة ؛ int ، string ، char ، float ، double ، long etc ...
public class Simple : ISimple
{
public int Number { get => 111 ; }
public string Text { get => "Some string" ; }
}الآن إنشاء الخادم ، كل ما يحتاجه هو اسم القناة. لاحظ أن هذا الأنبوب يعمل فقط على المضيف المحلي
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 ( ) ) ;
}عندما يقوم العميل بتوصيله ، سيشير إلى نفس الواجهة. بعد استخدام الاتصال لتلقي البيانات من الخادم
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 ( ) ) ;
}هناك حاجة إلى استثناء من أجل رمي pipeconnection يرمي "timout اتصال" وغيرها من الأخطاء.
لم أستخدم هذا الفصل مطلقًا في الفصول المعقدة ودعم هذا غير معروف.
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 ( ) أي مساهمة مرحب بها :)