سؤال

ما هو بناء الجملة لتحديد صفيف حرفي في CIL لأغراض تزيين عضو بسمات مخصصة؟

أنا أكتب بعض رمز .NET في CIL (باستخدام ilasm.exe لتجميعه) وأحتاج إلى تزيين طريقة بسمة مخصصة. يأخذ مُنشئ تلك السمة مجموعة من الأعداد الصحيحة كمعلمة لها الوحيدة. كيف يمكنني فعل هذا في CIL؟

هذا هو توقيع مُنشئ السمة المخصصة (لا يمكنني تغييره):

public FooAttribute(int[] values) {
// some hidden constructor stuff
}

هذه هي الطريقة التي كنت أزين طريقتي إذا كنت أكتب في C# (لكن لا يمكنني):


[Foo(new int[] {1, 2, 3, 4})]
public string Bar() {
  return "Some text";
}

إن استخدام ildasm.exe للنظر في C# (لمحاولة الفهم عن طريق الهندسة العكسية) يعطيني حرفيًا ثنائيًا قبيحًا وغير قابل للاستخدام. لقد حاولت استخدام Reflector.net بدلاً من ذلك ويبدو أفضل بكثير ولكن ilasm.exe يلقي خطأ في بناء الجملة في الكلمة الرئيسية "جديدة" لذلك لا يمكنني استخدامها:

.custom instance void SomeNamespace.FooAttribute::.ctor(int32[]) = { new int32[int32(4)] { int32(1), int32(2), int32(3), int32(4) } }
هل كانت مفيدة؟

المحلول

من الصعب تخمين ما قد تكون مشكلتك. إذا قمت بتطبيق هذه السمة على طريقة برنامج est () ، أحصل على هذا:

  .method private hidebysig static void  Test() cil managed
  {
    .custom instance void ConsoleApplication1.FooAttribute::.ctor(int32[]) = ( 01 00 04 00 00 00 01 00 00 00 02 00 00 00 03 00 
                                                                               00 00 04 00 00 00 00 00 ) 
    // Code size       2 (0x2)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ret
  } // end of method Program::Test

تشغيل هذا من خلال ilasm.exe ، لا مشكلة. لاحظ كيف يتم بالفعل تحويل قيم عنصر الصفيف (قم بتمرير نافذة القصاصة إلى اليمين لرؤيتها) إلى التنسيق اللازم لتضمينها في جدول بيانات منشئ السمات. BitConverter.getBytes () يمكن أن تحصل على جزء من هذه المهمة. يجب أن يكون لمستند ECMA التنسيق المطلوب لتلك البيانات.

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