سؤال

لنفترض أن لدي تطبيقين مكتوبين بلغة C#.الأول هو تطبيق تابع لجهة خارجية يقوم بإنشاء حدث يسمى "OnEmailSent".

والثاني هو تطبيق مخصص كتبته وأرغب في الاشتراك بطريقة ما في "OnEmailSent" حتى في التطبيق الأول.

هل هناك أي طريقة يمكنني من خلالها إرفاق التطبيق الثاني بطريقة أو بأخرى بمثيل التطبيق الأول للاستماع إلى حدث "OnEmailSent"؟


لذا لمزيد من التوضيح، السيناريو المحدد الخاص بي هو أن لدينا تطبيقًا مخصصًا لجهة خارجية مكتوبًا بلغة c# والذي يثير حدث "OnEmailSent".يمكننا أن نرى أن الحدث موجود باستخدام العاكس.

ما نريد القيام به هو تنفيذ بعض الإجراءات الأخرى عندما يرسل هذا المكون بريدًا إلكترونيًا.

الطريقة الأكثر فعالية التي يمكن أن نفكر بها هي أن نكون قادرين على استخدام شكل من أشكال IPC كما اقترح anders والاستماع إلى حدث OnEmailSent الذي يتم رفعه بواسطة مكون الطرف الثالث.

نظرًا لأن المكون مكتوب بلغة C#، فإننا نتعامل مع فكرة كتابة تطبيق C# آخر يمكنه ربط نفسه بعملية التنفيذ وعندما يكتشف أن حدث OnEmailSent قد تم رفعه، فإنه سينفذ كود معالجة الحدث الخاص به.


ربما أفتقد شيئًا ما، ولكن ما أفهمه عن كيفية عمل العمل عن بُعد هو أنه يجب أن يكون هناك خادم يحدد نوعًا ما من العقد الذي يمكن للعميل الاشتراك فيه.

كنت أفكر أكثر في سيناريو حيث قام شخص ما بكتابة تطبيق مستقل مثل Outlook على سبيل المثال، والذي يعرض الأحداث التي أرغب في الاشتراك فيها من تطبيق آخر.

أعتقد أن السيناريو الذي أفكر فيه هو مصحح أخطاء .net وكيف يمكن ربطه بتنفيذ التجميعات لفحص الكود أثناء تشغيله.

هل كانت مفيدة؟

المحلول

لكي يتمكن تطبيقان (عمليتان منفصلتان) من تبادل الأحداث، يجب أن يتفقا على كيفية توصيل هذه الأحداث.هناك العديد من الطرق المختلفة للقيام بذلك، والطريقة التي سيتم استخدامها بالضبط قد تعتمد على البنية والسياق.المصطلح العام لهذا النوع من تبادل المعلومات بين العمليات هو الاتصالات بين العمليات (IPC).توجد العديد من الطرق القياسية لإجراء IPC، وأكثرها شيوعًا هي الملفات، والأنابيب، ومآخذ (الشبكة)، استدعاءات الإجراء البعيد (RPC) والذاكرة المشتركة.ومن الشائع أيضًا استخدامه على نظام التشغيل Windows رسائل النافذة.

لست متأكدًا من كيفية عمل ذلك مع تطبيقات .NET/C# على نظام التشغيل Windows، ولكن يمكنك القيام بذلك في تطبيقات Win32 الأصلية يتم ربطهم بحلقة الرسائل الخاصة بالعمليات الخارجية و"التجسس" على الرسائل التي يرسلونها.إذا قام برنامجك بإنشاء حدث رسالة عند استدعاء الوظيفة المطلوبة، فقد تكون هذه طريقة لاكتشافه.

إذا كنت تقوم بتنفيذ كلا التطبيقين بنفسك، فيمكنك اختيار استخدام أي طريقة IPC تفضلها.تحظى مآخذ الشبكة والبروتوكولات المستندة إلى مقابس المستوى الأعلى مثل HTTP وXML-RPC وSOAP بشعبية كبيرة هذه الأيام، لأنها تتيح لك تشغيل التطبيقات على أجهزة فعلية مختلفة أيضًا (نظرًا لأنها متصلة عبر شبكة).

نصائح أخرى

يمكنك المحاولة الجاسوس المدار وللوصول البرنامجي ManagedSpyLib

تقدم ManagedSpylib فئة تسمى ControlProxy.ControlProxy هو تمثيل لنظام. windows.forms.control في عملية أخرى.يتيح لك ControlProxy الحصول على أو تعيين خصائص والاشتراك في الأحداث كما لو كنت تعمل داخل عملية الوجهة.استخدم ManagedSpylib لاختبار الأتمتة ، أو تسجيل الأحداث للتوافق ، أو اتصال العمليات المتقاطعة ، أو اختبار Whitebox.

ولكن هذا قد لا يناسبك، ويعتمد ذلك على ما إذا كان ControlProxy يمكنه الوصول بطريقة أو بأخرى إلى الحدث الذي تبحث عنه داخل تطبيق الطرف الثالث الخاص بك.

يمكنك أيضًا استخدام ريفلكسل

يسمح Reflexil بتعديلات IL باستخدام مكتبة Mono.cecil القوية التي كتبها JB Evain.يتم تشغيل Reflexil كمكون عاكس ويتم توجيهه خاصة نحو معالجة رمز IL.إنه ينجز هذا من خلال اقتراح محرر تعليمات كامل والسماح بحقن رمز C#/VB.NET.

يمكنك إما استخدام التحكم عن بعد أو WCF.يرى http://msdn.microsoft.com/en-us/library/aa730857(VS.80).aspx#netremotewcf_topic7.

ما طبيعة حدث OnEmailSent هذا من تطبيق الطرف الثالث؟أعني، كيف تعرف أن التطبيق يقوم بتشغيل مثل هذا الحدث؟

لو أنت إذا كنت تخطط لإجراء اتصالات بين العمليات، فإن السؤال الأول الذي يجب أن تطرحه على نفسك هو:هل هو ضروري حقا؟

دون التشكيك في دوافعك، إذا كنت بحاجة حقًا إلى إجراء اتصالات بين العمليات، فستحتاج إلى نوع من الآلية.القائمة طويلة، طويلة جداً.من رسائل WM_DATA البسيطة إلى بروتوكولات TCP المخصصة إلى خدمات الويب المعقدة للغاية التي تتطلب بنى تحتية إضافية.

وهذا يثير السؤال، ما الذي تحاول القيام به بالضبط؟ما هو تطبيق الطرف الثالث الذي لا يمكنك التحكم فيه؟

كما أن لدى مصحح الأخطاء طريقة غزوية للغاية لعمليات تصحيح الأخطاء.لا تتوقع أن تكون هذه هي الآلية القياسية للعمليات التي تستخدمها جميع التطبيقات الأخرى.في واقع الأمر، ليس كذلك.

يمكنك تنفيذ سيناريو مماثل باستخدام إعلامات تغيير استعلام SQL Server 2005 عن طريق الحفاظ على اتصال SqlConnection المستمر باستخدام تطبيق .NET الذي يحظر حتى تتغير البيانات في قاعدة البيانات.

يرى http://www.code-magazine.com/article.aspx?quickid=0605061.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top