.NET 4.0 और अधिक के लिए अद्यतन प्राप्त करें
.Net 2.0 के समय में पूछा गया यह एक पुराना प्रश्न है, जब मिश्रित मोड के लिए समर्थन में DLL को गंभीर आरंभीकरण की समस्या थी, यादृच्छिक गतिरोध की संभावना थी। .Net 4.0 के रूप में, मिश्रित मोड DLLs का इनिशियलाइज़ेशन बदल गया है। अब आरंभीकरण के दो अलग-अलग चरण हैं:
- मूल आरंभीकरण, जिसे DLL के प्रवेश बिंदु पर कहा जाता है, जिसमें देशी C ++ रन-टाइम सेटअप और आपके DllMain पद्धति का निष्पादन शामिल है।
- प्रबंधित आरंभीकरण, सिस्टम लोडर द्वारा स्वचालित रूप से निष्पादित।
चूंकि चरण # 2 लोडर लॉक के बाहर किया जाता है, इसलिए कोई गतिरोध नहीं है। विवरण मिश्रित विधानसभाओं के प्रारंभ में वर्णित हैं ।
यह सुनिश्चित करने के लिए कि आपकी मिश्रित मोड असेंबली को मूल निष्पादन योग्य से लोड किया जा सकता है, केवल एक चीज जिसे आपको जांचने की आवश्यकता है वह यह है कि DllMain विधि को मूल कोड के रूप में घोषित किया गया है। #pragma unmanaged
यहाँ मदद कर सकता है:
#pragma unmanaged
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
... // your implementation here
}
यह भी महत्वपूर्ण है कि DllMain को प्रत्यक्ष या अप्रत्यक्ष रूप से कॉल करने वाला कोई भी कोड अप्रबंधित है। यह DllMain द्वारा उपयोग की जाने वाली कार्यक्षमता के प्रकार को सीमित करने के लिए समझ में आता है ताकि आप DllMain से आने वाले सभी कोड का पता लगा सकें और यह सुनिश्चित कर सकें कि यह सब संकलित है#pragma unmanaged
।
कम्पाइलर आपको C4747 को चेतावनी देते हुए थोड़ी मदद करता है अगर यह पता लगाता है कि DllMain को अप्रबंधित घोषित नहीं किया गया है:
1> Generating Code...
1>E:\src\mixedmodedll\dllmain.cpp : warning C4747: Calling managed 'DllMain': Managed code may not be run under loader lock, including the DLL entrypoint and calls reached from the DLL entrypoint
हालांकि कंपाइलर कोई चेतावनी उत्पन्न नहीं करेगा यदि DllMain अप्रत्यक्ष रूप से कुछ अन्य प्रबंधित फ़ंक्शन को कॉल करता है, तो आपको यह सुनिश्चित करने की आवश्यकता है कि ऐसा कभी नहीं होता है, अन्यथा आपका एप्लिकेशन बेतरतीब ढंग से गतिरोध कर सकता है।