[इस TLDR हो रही है ... खेद ...]निर्धारण जब नेट के बारे में में लोड किया जा रहा है (अप्रबंधित) सी ++
मैं DLLs के सैकड़ों के साथ एक विशाल (अधिकतर) सी ++/MFC आवेदन पर काम ; यह COM के माध्यम से एक गतिशील रूप से लोड "एड इन" तंत्र का समर्थन करता है, इस प्रकार COM इंटरऑप का उपयोग करके .NET में एड-इन्स विकसित किया जा सकता है। इस "ऐड-इन" तंत्र का उपयोग करते हुए .NET w/o में कुछ सीमित नई कार्यक्षमता विकसित की गई है (हालांकि अभी भी गतिशील रूप से लोड हो चुकी है); हालांकि, अंतिम उपयोगकर्ता इस सुविधा का उपयोग न करने का निर्णय ले सकता है। इस प्रकार, .NET स्टार्टअप पर लोड नहीं किया जा सकता है।
लेकिन, जब नेट भरी हुई, मैं कुछ नेट विशेष initialzation क्या करने की जरूरत है (विशेष रूप से देशी/अप्रबंधित यूआई मैच के लिए CurrentUICulture की स्थापना)।
एक समाधान केवल पंट करना और ऐसा करना है .NET प्रारंभिकता जब कोड नए .NET functionaliy या COM एड-इन्स को लोड करने के लिए हो जाता है। इस आवेदक की प्रकृति को देखते हुए, यह शायद 95 +% समाधान है (अधिकतर उपयोगकर्ता नई कार्यक्षमता का उपयोग करेंगे)।
लेकिन यह मूर्खतापूर्ण नहीं है। कोई भी /clr ध्वज (याद रखें, यह एक बड़ा एप्लीकेशन है) के साथ मॉड्यूल बनाने के द्वारा किसी भी समय नई .NET कार्यक्षमता को "आसानी से" जोड़ सकता है।
एक और मजबूत (और स्पष्ट) समाधान केवल सीई ++/सीएलआई के माध्यम से स्टार्टअप पर लोड होने के लिए .NET का कारण बनता है। लेकिन कुछ मरने वाले सी ++ डेवलपर जिनके लिए प्रत्येक बाइट और घड़ी चक्र पदार्थ ऐसा नहीं करना चाहते हैं; कुछ हद तक समझ में आता है क्योंकि CurrentUICulture सेट करने की आवश्यकता नहीं है जब तक कि .NET लोड नहीं हो जाता है।
एक और संभावना मैंने सोचा कि LoadLibrary
को हुक करना और mscorlib देखें। अब मुझे पता है कि .NET किसी कारण से लोड होने वाला है, इसे सामान्य तरीके से लोड करें और दूसरे कोड से पहले प्रारंभ करने से पहले प्रारंभ करें। लेकिन LoadLibrary
(या उस मामले के लिए कुछ भी) हुकिंग वास्तव में ऐसा कुछ नहीं है जिसे मैं करना चाहता हूं।
तो, क्या .NET लोड होने के बारे में बताने के लिए कोई आसान (ier)/बेहतर तरीका है?
संपादित करें: LockClrVersion की रीड का जवाब बहुत रफ़ू करीब है। एकमात्र हिचकी यह है कि यदि आप मिश्रित-मोड DLL/असेंबली में लिंक करते हैं तो यह काम नहीं करेगा।
// ClrAboutToLoad.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <MSCorEE.h>
// http://community.bartdesmet.net/blogs/bart/archive/2005/07/22/2882.aspx
FLockClrVersionCallback begin_init, end_init;
STDAPI hostCallback()
{
printf("hostCallback()\n");
// we're in control; notify the shim to grant us the exclusive initialization right
begin_init();
ICLRRuntimeHost *pHost = NULL;
HRESULT hr = CorBindToRuntimeEx(NULL, L"wks", STARTUP_SERVER_GC, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID*) &pHost);
hr = pHost->Start();
// mission completed; tell the shim we're ready
end_init();
return S_OK;
}
int _tmain(int argc, _TCHAR* argv[])
{
LockClrVersion(&hostCallback, &begin_init, &end_init);
//fnTheDLL();
HMODULE hModule = LoadLibrary(L"TheDLL");
FARPROC fp = GetProcAddress(hModule, "fnTheDLL");
typedef void (*fnTheDLL_t)();
fnTheDLL_t fnTheDLL = reinterpret_cast<fnTheDLL_t>(fp);
fnTheDLL();
FreeLibrary(hModule);
return 0;
}
यह आशाजनक लग रहा है! –
यह ठीक वही करना चाहिए जो आप बाद में कर रहे हैं - मैंने इसे कभी भी लागू नहीं किया है, लेकिन मैं इसे ट्रैक करने की कोशिश कर रहे पूरे सीएलआर होस्टिंग एपीआई के माध्यम से चला गया। –
यह लगभग सही है; एकमात्र हिचकिचाहट यह है कि आपको यह सुनिश्चित करने की ज़रूरत है कि कॉल करने से पहले सीएलआर लोड होने के कारण कुछ भी नहीं हो * LockClrVersion *। "समस्या" यह है कि मिश्रित मोड असेंबली में लिंकिंग सीएलआर लोड करती है, आपको गतिशील रूप से असेंबली लोड करना होगा। –