c# - सी#में मॉड्यूल प्रारंभकर्ता




clr clr-module-initializer (4)

मॉड्यूल प्रारंभकर्ता सीएलआर की एक विशेषता है जो सी # या वीबी.नेट में सीधे उपलब्ध नहीं है। वे वैश्विक स्थैतिक विधियों हैं जिन्हें .cctor नाम दिया .cctor है जिन्हें किसी असेंबली में किसी भी अन्य कोड (प्रकार प्रारंभकर्ताओं, स्थिर .cctor से पहले चलाने की गारंटी दी जाती है। मैं हाल ही में एक परियोजना में इसका उपयोग करना चाहता था और मोनो.सीसिल का उपयोग करके अपने स्वयं के समाधान (कंसोल प्रोग्राम / एमएसबिल्ड कार्य) को एक साथ जोड़ दिया था, लेकिन मैं सोच रहा था:

  1. मॉड्यूल intializers उत्सर्जित करने में सी # कंपाइलर चाल करने का कोई तरीका है? कोई भी विशेषता (जैसे कंपाइलर जेनरेटेड, स्पेशलनाम) या अन्य ट्रिकरी जिसका उपयोग किया जा सकता है?

  2. क्या सी # / वीबी.नेट कभी भी इन उद्देश्यों को किसी उद्देश्य के लिए उत्सर्जित करता है? मैंने जो देखा है उससे कुछ इंटरऑप उद्देश्यों के लिए प्रबंधित सी ++ द्वारा उनका उपयोग किया जाता है, लेकिन मुझे अन्य प्रयोजनों के लिए उपयोग करने के लिए कोई संदर्भ नहीं मिला। कोई विचार?


इयनार, आपके प्रश्न ने मुझे स्पष्ट नहीं किया है कि आपने पहले से ही एक उपकरण लिखा है जो पहले से संकलित असेंबली में मॉड्यूल प्रारंभकर्ता को इंजेक्ट करने की अनुमति देता है।

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

मैंने आपके आवेदन की कोशिश की और यह पूरी तरह से काम करता है। जैसा कि आप लिखते हैं, इसे सभी मौजूदा ढांचे के साथ 2 से 4.5 तक काम करना चाहिए।

केवल एक समस्या है जो आपके समाधान को मेरे लिए बेकार बनाती है: आपका प्रारंभकर्ता तब कॉल किया जाता है जब एप्लिकेशन पहली बार असेंबली में कुछ भी एक्सेस करता है।

मुझे जो चाहिए वह यह है कि जब विधानसभा प्रक्रिया में लोड हो जाती है तो मॉड्यूल प्रारंभकर्ता को तत्काल बुलाया जाना चाहिए। लेकिन यह नहीं है। इसलिए यदि आवेदन असेंबली तक नहीं पहुंचता है तो इसे कभी शुरू नहीं किया जाएगा।

पूरे दिन जांच करने के बाद मुझे ऐसा लगता है कि इसे प्राप्त करने का एकमात्र तरीका एक प्रबंधित सी ++ असेंबली लिखना और डेलमेन () में कोड निष्पादित करना है।


नहीं, उन्हें सी # में उत्सर्जित करने का कोई तरीका नहीं है, क्योंकि सी # कक्षा / संरचना में सबकुछ रखता है और मॉड्यूल प्रारंभकर्ताओं को वैश्विक होने की आवश्यकता होती है।

आपको उन्हें लिखने के लिए एक अलग टूल का उपयोग करना होगा, अधिमानतः आईएल-असेंबलर।

दूसरे प्रश्न के लिए, मुझे यह मानना ​​है कि मुझे नहीं पता, लेकिन मैंने सी # द्वारा उत्पन्न कोई भी कभी नहीं देखा है, और मैं अक्सर आईएलडीएएसएम का उपयोग करता हूं, इसलिए मुझे लगता है कि यह उन्हें छोड़ नहीं देता है।


शायद System.Reflection.EmitSystem.Reflection.Emit नामस्थान नाम दें आपकी मदद कर सकते हैं। MethodAttributes गणना में समान तत्व होते हैं (SpecialName, RTSpecialName)


सिमोन क्रॉप द्वारा लिखित भयानक ओपनसोर्स आईएल-वीवर प्रोजेक्ट " fody " का मॉड्यूल प्रारंभकर्ता एडन देखें: https://github.com/fody/moduleinit

यह आपको एक विधि निर्दिष्ट करने की अनुमति देता है जिसे फोडी द्वारा असेंबली प्रारंभकर्ता में अनुवादित किया जाएगा:

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

यह हो जाता है:

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




clr-module-initializer