بشكل عام ، كيفية تحويل بناء جملة Ilasm إلى انعكاس.
-
27-09-2019 - |
سؤال
أنا أكتب مجموعة صغيرة للأغراض الخاصة وغالبًا ما أرى 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!"
نصائح أخرى
أود استخدام مكون 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 ().