سؤال

ما هي الطرق "طبيعية" للقيام المكونات الإضافية في اللغات جمعت (C # / C / C ++ / D)؟ أنا مهتم بشكل خاص في النهج الملحد لغة ولكن محددة لغة غير مقبول.

لفي الوقت الراهن، "وقت الترجمة" المكونات في النهج (تشمل فقط رمز أم لا، ويعمل كل شيء) صالحة ولكن يفضل الأشياء التي يمكن أن تهاجر إلى نهج أكثر ديناميكية.

وفيما يتعلق نوع وقت، وأنا أكثر اهتماما في الميكانيكا من تحميل المكونات في وغيرها من تصميم / واجهة التطبيق في المكونات

وتحرير: راجع للشغل البرنامج المساعد سيكون عبدا لا سيدا. فإن الإجراء الأساسي من المكونات في أن يكون لأنه في ظل حالة معينة، سوف يطلق عليه إلى "بذل كل شيء"، وإعطاء كائن البيئة التي ينبغي استخدامها للحصول على ما يحتاجه للعمل.

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

المحلول

لغات جمعت (حيث جمعت يعني أن البرنامج يعمل على أنه قابل للتنفيذ الأصلي، دون أي نوع من الجهاز الظاهري)، وكنت الى حد كبير الحاجة إلى استخدام نوع من نهج مكتبة المشتركة الخاصة بالنظام الأساسي. في ويندوز، وهذا يعني استخدام دلس.

ويمكنك تحديد واجهة البرنامج المساعد الخاص بك من حيث مجموعة من الوظائف (مع أسماء محددة، والحجج، والاتفاقيات الدعوة). بعد ذلك، يمكنك تحميل عناوين وظائف داخل المكتبة المشتركة والذهاب الى المدينة. في ويندوز، وهذا يعني استخدام GetProcAddress () ثم صب قيمة الإرجاع إلى مؤشر دالة من النوع المناسب في C، أو ما يعادل هو في اللغة التي تستخدمها.

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

نصائح أخرى

Mono.Addins يبدو أن هناك حلا جيدا ل.NET. وأعتقد أنه يشمل API للسماح لك لتحميل الإضافات (أو الوظائف الإضافية) من الريبو وحيوي تحميله في التجمع قيد التشغيل.

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

ومنشئات ثابتة هي في أكثر الأحيان، "ذكية" بالمعنى السيئ. وبما انك ستكون لدينا لتحميل (C / C ++: dlopen والأصدقاء لينكس) الإضافات في وقت واحد على أي حال (في حالة ديناميكية)، قد كنت كذلك تهيئة واضح لهم كما كنت تفعل ذلك. من بين أمور أخرى، قد تعطيك فرصة لرفض الإضافات دون في المعهد متوقعا.

ملحوظة، لم يكن لديك لاستخدام المكتبات تحميل ديناميكية لالإضافات. ويمكن أيضا أن آليات أخرى يمكن استخدامها: الذاكرة المشتركة، ومآخذ، إلخ ...

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

لالمساعد الرقيق من نوع حيث تلخص كل المكونات في تطبيق مختلف من مجموعة مشتركة من وظائف، وأود أن مجرد إيداع ملفات DLL في مجلد البرنامج المساعد يعرف إلى التطبيق المضيف (على سبيل المثال "ج: الملفات \ برنامج \ اسم التطبيق \ الإضافات )، ومن ثم استدعاء دلس من المضيف عن طريق التأمل.

أنت <م> يمكن القيام ببعض نوع من عملية التسجيل معقدة عند تثبيت كل DLL، لكني لم اشهد ابدا أي مشاكل مع الإضافات في و-مجلد واحد بسيط النهج.

وتحرير: للقيام بذلك في C #، يمكنك فقط إضافة فئة العامة إلى DLL (المسمى "المساعد" أو أيا كان)، وتنفيذ المهام المطلوبة هناك. من المضيف الخاص بك، يمكنك ثم إنشاء كائن من نوع البرنامج المساعد، وندعو أساليبها (جميع استخدام التأمل).

يبدو

واجهات مع التسجيل الفراغ (ل EventSource) للعمل بشكل جيد - راجع ASP.NET في <لأ href = "http://msdn.microsoft.com/en-us/library/system.web.ihttpmodule.init.aspx "يختلط =" نوفولو noreferrer "> IHttpModule.Init (HttpApplication ) على سبيل المثال.

وهذا يسمح للمؤلف التطبيق (الذي يسيطر ل EventSource) لإضافة الأحداث حسب الحاجة، دون الحاجة إلى تمديد واجهة IPlugin (مما يؤدي حتما إلى IPluginEx، IPlugin2، IPlugin2Ex، الخ.)

ونهج لقد استعملت (في .NET) هو أن يكون المضيف إجراء مكالمة الأولية إلى البرنامج المساعد (عن طريق التأمل)، ابتداء من المساعد وتمرير إشارة إلى المضيف أن البرنامج المساعد يحفظ. البرنامج المساعد ثم باستدعاء الأساليب على المضيف (أيضا عن طريق التفكير) عند الضرورة.

وأعتقد مع معظم الإضافات، فإن عادة يتم المكالمات في الاتجاه الآخر (أي المضيف سيدعو البرنامج المساعد عند الضرورة). في حالتي، والإضافات زيارتها أنفسهم عناصر واجهة المستخدم التي تحتاج إلى الاستفادة من وظائف المضيف.

وقضايا التنفيذ انخفاض حدة مستوى جانبا (مثل ويندوز دلس وقضايا التنفيذ)، ومحرك اللعبة يمكنني استخدام للتو وظيفة تسجيل العالمية في دلس، ويحاول أن يجد والذي يطلق عليه في كل دلل في الدليل المساعد. وظيفة registartion لا أي مسك الدفاتر اللازمة للكشف عن وظيفة.

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