سؤال

المهبل الوحدة النمطية هي ميزة CLR التي لا تتوفر مباشرة في C # أو VB.NET. هم الأساليب الثابتة العالمية المسماة .cctor من المضمون تشغيلها قبل تنفيذ أي رمز آخر (النوع من النوع، والبناة الثابتة) في التجميع. أردت مؤخرا استخدام هذا في مشروع و اخترق معا الحل الخاص بي (برنامج وحدة التحكم / مهمة MSBUILD) باستخدام Mono.Cecil، لكنني كنت أتساءل:

  1. هل هناك أي طريقة لخداع C # المترجم في الوحدة النمطية المنبعثة؟ أي سمات (مثل المركب، الاسم الخاص) أو الخداع الأخرى التي يمكن استخدامها؟

  2. هل تنبعث من c # / vb.net من أي وقت مضى هؤلاء المهبلين أنفسهم لبعض الغرض؟ من ما رأيته يتم استخدامها من خلال إدارة C ++ المدارة لبعض أغراض الترابط، لكن لم أجد أي إشارة إليهم يستخدم لأغراض أخرى. أيه أفكار؟

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

المحلول

لا، لا توجد وسيلة لانبعاثها في C #، لأن C # يضع كل شيء في الفئة / الهيكل والتهائم في الوحدة النمطية يجب أن تكون عالمية.

سيتعين عليك استخدام أداة مختلفة لكتابةها، ويفضل أن يكون IL-Assembler.

بالنسبة للسؤال الثاني، يجب أن أعترف بأنني لا أعرف، لكنني لم أر أي ناتج عنها من قبل C #، وأستعبها في كثير من الأحيان، لذلك أفترض أنها لا تنبعث منها.

نصائح أخرى

تحقق من وحدة التهيئة الملحق من مشروع Opensource IL-Weaver Awesome "fody."، كتبها Simon Cropp: https://github.com/fody/moduleinit.

يسمح لك بتحديد طريقة سيتم ترجمةها إلى تجميع التجميع بواسطة Fody:

public static class ModuleInitializer
{
    public static void Initialize()
    {
        //Init code
    }
}

الحصول على هذا:

static <Module>()
{
    ModuleInitializer.Initialize();
}

يمكن System.Reflection.Emit مساحة الاسم يمكن أن تساعدك. MethodAttributes التعداد يحتوي على عناصر مماثلة (SpecialName, RTSpecialName).

عين، سؤالك لم يتضح لي أنك كتبت بالفعل أداة تسمح بحقن المهجع الوحدة النمطية إلى مجموعة مجمعة بالفعل.

http://einaregilsson.com/module-initializers-in-csharp.

جربت طلبك ويعمل تماما. كما تكتب يجب أن تعمل مع جميع الأطر الحالية من 2 إلى 4.5.

هناك مشكلة واحدة فقط تجعل حلكم عديمة الفائدة بالنسبة لي: يتم استدعاء التهيلي الخاص بك عندما يصل التطبيق أولا إلى أي شيء في التجميع.

ما أحتاج إليه هو أن يتم استدعاء المهيمة الوحدة النمطية على الفور عند تحميل الجمعية في هذه العملية. لكنها ليست كذلك. لذلك إذا كان التطبيق لا يصل إلى الجمعية، فلن يتم تهيئةها أبدا.

بعد التحقيق في يوم كامل، يبدو لي أن الطريقة الوحيدة للحصول على هذا هو كتابة تجميع C ++ مدار وتنفيذ التعليمات البرمجية في Dllmain ().

إذا كان لديك منشئ ثابت أو فصول Singleton التي يمكنك الوصول إليها، فسوف ينبعث برنامج مترجم V # متغير ثابت .CTOR.

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