내가 DLL을 수백 거대한 (대부분) C++/MFC 응용 프로그램에서 작동(관리되지 않는) C++
[이 ... 죄송합니다 ... TLDR을 받고있다] ; COM을 통해 동적으로로드되는 "추가 기능"메커니즘을 지원하므로 COM interop을 사용하여 .NET에서 추가 기능을 개발할 수 있습니다. 이 "추가 기능"메커니즘 (아직 동적으로로드되어 있음에도 불구하고)을 사용하지 않고 일부 제한된 새 기능이 .NET에서 개발되었습니다. 그러나 최종 사용자는이 기능을 사용하지 않기로 결정할 수 있습니다. 따라서 .NET은 시작할 때로드되지 않을 수 있습니다.
그러나, .NET 가가 좀 .NET 고유의 초기화와 작업을 수행 할 필요가로드 될 때 (특히 네이티브/관리되지 않는 UI에 맞게 CurrentUICulture 설정).
한 가지 해결 방법은 코드가 새로운 .NET 기능 또는 COM 추가 기능을로드하는 중일 때 간단히 펀치 앤해서이 .NET 초기화를 수행하는 것입니다. 이 응용 프로그램의 특성을 감안할 때, 아마도 95 % 이상의 솔루션입니다 (대부분의 사용자는 새로운 기능을 사용하게됩니다).
하지만 절대 안전한 것은 아닙니다. 누구든지 /clr 플래그가있는 모듈을 구축하여 언제든지 새로운 .NET 기능을 쉽게 추가 할 수 있습니다 (이는 거대한 응용 프로그램입니다).
한 가지 더 강력하고 (명백한) 해결책은 단순히 C++/CLI를 통해 시작시 .NET을로드하게하는 것입니다. 그러나 바이트와 클록주기가 중요한 다이 하드 C++ 개발자 중 일부는이 작업을 원하지 않습니다. 어느 정도 설정이 필요하지 않으므로 CurrentUICulture이 필요합니다.
내가 생각한 또 다른 가능성은 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;
}
이것은 유망 해 보인다! –
그것은 정확히 후 무엇을해야합니까 - 내가 그것을 implemneted하지 않은,하지만 난 그것을 추적하려고 전체 CLR 호스팅 API를 통해 갔다. –
이것은 거의 완벽합니다. 유일한 장애는 * LockClrVersion *을 호출하기 전에 CLR이로드되지 않도록해야한다는 것입니다. "문제"는 혼합 모드 어셈블리에서 연결하면 CLR이로드되므로 어셈블리를 동적으로로드해야합니다. –