C# كيفية إنشاء الوظائف التي يتم تفسيرها في وقت التشغيل

StackOverflow https://stackoverflow.com/questions/2458869

سؤال

أنا أقوم الوراثية البرنامج ولكن أنا ضرب الحد مع C# حيث أريد أن أقدم وظائف جديدة إلى الخوارزمية ولكن أنا لا يمكن أن تفعل ذلك بدون ترجمة البرنامج.في جوهر أريد المستخدم من البرنامج إلى توفير يسمح وظائف GP تلقائيا استخدامها.سيكون أمرا رائعا إذا كان المستخدم هو مطلوب أن نعرف قليلا عن البرمجة ممكن.

أريد أن سد العجز في الوظائف الجديدة دون ترجمة لهم في البرنامج.في بيثون هذا أمر سهل لأن كل تفسير, ولكن ليس لدي أي فكرة عن كيفية القيام بذلك مع C#.لا أحد يعرف كيف يمكن تحقيق ذلك في C# ؟ هل هناك أي المكتبات والتقنيات ، وما إلى ذلك ؟

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

المحلول

ذلك يعتمد على كيف تريد المستخدم من البرنامج "تقديم يسمح وظائف."

  • إذا كان المستخدم هو اختيار الوظائف التي كنت قد نفذت بالفعل ، يمكنك تمرير هذه حول المندوبين أو أشجار التعبير.
  • إذا كان المستخدم هو الذهاب الى الكتابة الخاصة بهم الطرق في C# أو آخر .صافي اللغة ، ترجمة لهم في الجمعية ، يمكنك تحميلها باستخدام التفكير.
  • إذا كنت تريد المستخدم أن يكون قادرا على كتابة C# كود المصدر إلى البرنامج يمكنك ترجمة ذلك باستخدام CodeDom ، ثم استدعاء الناتجة الجمعية باستخدام التفكير.
  • إذا كنت ترغب في توفير مخصص التعبير لغة المستخدم ، مثلرياضي بسيط اللغة ، ثم (على افتراض انك يمكن تحليل اللغة) يمكنك استخدام التفكير.تنبعث منها إلى توليد دينامية الجمعية وندعو أن استخدام-هل تفكر في ذلك -- التفكير.أو يمكنك بناء شجرة التعبير من رمز المستخدم وتجميع أن استخدام LINQ -- يعتمد على مدى المرونة التي تحتاج إليها.(وإذا كنت تستطيع الانتظار والتعبير الأشجار .NET 4.0 إزالة العديد من القيود التي كانت في 3.5, لذلك قد تكون قادرة على تجنب التفكير.تنبعث منها تماما.)
  • إذا كنت سعيدا على المستخدم إدخال استخدام عبارات Python, Ruby أو آخر DLR اللغة ، يمكنك المضيف الديناميكي وقت تشغيل اللغة التي سيتم تفسير المستخدم رمز بالنسبة لك.

استضافة (DLR و IronPython أو IronRuby) يمكن أن يكون خيارا جيدا هنا لأنك تحصل على اختبار جيد البيئة وجميع أمثلية DLR تقدم. هنا هو كيفية استخدام IronPython.

وأضاف ردا على الأداء الخاص بك السؤال: DLR معقول الذكية حول الأمثل.لا عمياء إعادة ترجمة التعليمات البرمجية المصدر في كل مرة:بمجرد تحويل شفرة المصدر (أو ، على وجه التحديد ، وظيفة معينة أو فئة) إلى MSIL, أنها سوف تبقي إعادة استخدام التي جمعت التمثيل حتى التغييرات التعليمات البرمجية المصدر (على سبيل المثالوظيفة إعادة تعريف).حتى إذا كان المستخدم يحتفظ باستخدام نفس الوظيفة ولكن على مجموعات مختلفة من البيانات ، ثم طالما أنك يمكن أن تبقي على نفس ScriptScope حولها ، يجب عليك الحصول على كريمة perf;كما سبق إذا كان القلق هو فقط أن كنت تنوي تشغيل نفس الوظيفة عدد مهول من المرات خلال الخوارزمية الجينية.استضافة DLR من السهل جدا القيام به ، لذلك ينبغي أن لا يكون من الصعب القيام به دليل على مفهوم وقياس لمعرفة ما إذا كان يصل إلى تلبية الاحتياجات الخاصة بك.

نصائح أخرى

ويمكنك محاولة لخلق والتلاعب الأشجار التعبير . استخدام ينق لتقييم أشجار التعبير.

ويمكنك أيضا استخدام CodeDom لتجميع وتشغيل وظيفة. بالتأكيد يمكنك جوجل لرؤية بعض الأمثلة التي قد تناسب احتياجاتك. ويبدو أن هذه المادة "كيفية تجميع حيوي C # رمز " و هذه المادة" تنفيذ حيوي التعليمات البرمجية في صافي " يمكن أن تساعدك.

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

هنا

و

هنا

والثاني هو مقيم جافا سكريبت ولكن يمكن أن تتكيف بسهولة بما فيه الكفاية.

ويمكنك إلقاء نظرة على System.Reflection.Emit لإنشاء رمز على مستوى IL.

وأو توليد C #، ترجمة إلى مكتبة وتحميل أن حيوي. ليس ما يقرب من مرونة.

ووهو في الواقع من السهل جدا لتوليد IL. انظر هذا البرنامج التعليمي: http://www.meta-alternative.net/calc.pdf

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