بشكل عام ، كيفية تحويل بناء جملة Ilasm إلى انعكاس.

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

سؤال

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

تعديل: نعم ، رسم خرائط الرموز العليا إلى Ilgenerator هو واضح ومباشر ؛ أنا أتحدث عن كل الأشياء الأخرى مثل. directives والسمات. على سبيل المثال ، كيف يمكنك معرفة كيفية كتابة الانعكاس. انحراف ما يعادل شيء مثل Dictionary<TKey,TValue>?

.class public auto ansi serializable beforefieldinit Dictionary<TKey, TValue>
    extends System.Object
    implements System.Collections.Generic.IDictionary`2<!TKey, !TValue>,
    System.Collections.Generic.ICollection`1<valuetype 
        System.Collections.Generic.KeyValuePair`2<!TKey, !TValue>>, 
    ...
{
    .custom instance void System.Diagnostics.DebuggerDisplayAttribute::
        .ctor(string) = { string('Count = {Count}') }

    .method public hidebysig newslot virtual final instance bool TryGetValue
        (!TKey key, [out] !TValue& 'value') cil managed
    {
        .maxstack 3
        .locals init ([0] int32 num)
        ...

أو ماذا عن توجيه "بارام"؟

// public static void SayHello(string s = "Hello World!")
.method public hidebysig static void SayHello([opt] string s) cil managed
{
    .param [1] = "Hello World!"
هل كانت مفيدة؟

المحلول 3

نظرًا لعدم تمكن أحد من الإجابة على السؤال ، فإنني أختتم أي وثائق موجودة لإظهار العلاقة بين بناء جملة Ilasm و Relation.

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

نصائح أخرى

أود استخدام مكون emithelper التابع Bltoolkit من اجل ذلك الهدف. ويوفر واجهة برمجة تطبيقات بطلاقة تشبه رمز IL ، ولف الانعكاس. مثال مستخرج من المقالة المرتبطة:

EmitHelper emit = new AssemblyBuilderHelper("HelloWorld.dll")
    .DefineType  ("Hello", typeof(object), typeof(IHello))
    .DefineMethod(typeof(IHello).GetMethod("SayHello"))
    .Emitter;
emit
    // string.Format("Hello, {0}!", toWhom)
    //
    .ldstr   ("Hello, {0}!")
    .ldarg_1
    .call    (typeof(string), "Format", typeof(string), typeof(object))

    // Console.WriteLine("Hello, World!");
    //
    .call    (typeof(Console), "WriteLine", typeof(string))
    .ret();

Type type = emit.Method.Type.Create();

أنت تنظر إلى IL لـ System.Collections.generic.Dictionary <>. اسم فئة "القاموس" هو السلسلة التي تنقلها إلى modulebuilder.definetype ().

يتم إنشاء سمة .param في C# الإصدار 4 أو vb.net للمعلمات التي لها قيمة افتراضية. قمت بتعيينه مع parameterbuilder ستعود من methodbuilder.defineParameter (). استخدم طريقة setConstant ().

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