سؤال

وأنا أحاول أن أكتب لي لعبة بلدي لعبة اللغة -> MSIL مترجم من أجل الحصول على فهم أفضل لكيفية عمل المجمعين. حصلت على تحليل وlexing في العمل، لقد بنيت الأشجار التعبير واستخدام شجرة API System.Linq.Expressions التعبير، ولدي مترجم العمل. الآن أود أن تنبعث منها بعض المجالس MSIL الحقيقي.

والمشكلة هي، وأنا لا يمكن معرفة كيفية بناء الواقع هذه التجمعات. الطبقة MethodBuilder لا يقبل إلا الهيئات أسلوب MSIL الخام ، لذلك لا بد لي من الحصول على MSIL الخام من بلدي شجرة التعبير. داعيا Expression.Compile () إرجاع مندوب العمل لكنني لست قادرة على الحصول على MSIL الكامنة. داعيا MethodInfo.GetMethodBody () يطرح InvalidOperationException نظرا لأنه لم تنفذ في تلك الفئة خاص بالأطفال.

وكيف يمكنني ربط ذلك مندوب في البرلمان الجديد؟

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

المحلول

وفقط وجدت. الكشف عن نسخة DLR من LambdaExpression طريقة CompileToMethod الذي يفعل بالضبط ما أحتاج.

lambdaExpression.CompileToMethod(myMethodBuilder);

نصائح أخرى

في لتنبعث منها IL الخام تحتاج إلى تعريف AST الخاصة بك. تحتاج إلى الحصول على AssemblyBuilder ثم ModuleBuilder وبعد ذلك يمكنك تحديد طريقة على مستوى الوحدة النمطية أو الحصول على TypeBuilder جديد والآن MethodBuilder لتحديد طريقة على مستوى الصف.

وقلت ان لديك بالفعل lexer ومحلل. هذا يعني أنك قادرة على بناء AST. حتى مجرد المشي من خلال تعبيرات تحليل وتنبعث منها IL الخاص بك.

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

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