C++ ICLRRuntimeHost::UnloadAppDomain失败
我正在尝试将托管c++/cli dll加载到本机进程中,因此我创建了一个启动clr并调用托管dll的引导dll,一切正常,但我无法终止/卸载clr。这是代码。InitCLR和FinitCr由injector调用,调用UnloadAppDomain返回0x801315,GetAppdomainId托管函数是返回AppDomain::CurrentDomain->Id的函数C++ ICLRRuntimeHost::UnloadAppDomain失败,c++,c++-cli,C++,C++ Cli,我正在尝试将托管c++/cli dll加载到本机进程中,因此我创建了一个启动clr并调用托管dll的引导dll,一切正常,但我无法终止/卸载clr。这是代码。InitCLR和FinitCr由injector调用,调用UnloadAppDomain返回0x801315,GetAppdomainId托管函数是返回AppDomain::CurrentDomain->Id的函数 不幸的是,卸载一次加载的CLR是不可能的,如重要部分所述: 此方法不会向主机释放资源、卸载应用程序域或销毁线程。您必须终止进程
不幸的是,卸载一次加载的CLR是不可能的,如重要部分所述: 此方法不会向主机释放资源、卸载应用程序域或销毁线程。您必须终止进程才能释放这些资源
auto StartCLR(std::wstring clr_version) -> ICLRRuntimeHost * {
ICLRMetaHost *meta_host = nullptr;
ICLRRuntimeInfo *runtime_info = nullptr;
ICLRRuntimeHost *runtime_host = nullptr;
if (CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, reinterpret_cast<LPVOID *>(&meta_host)) == S_OK) {
if (meta_host->GetRuntime(clr_version.c_str(), IID_PPV_ARGS(&runtime_info)) == S_OK) {
BOOL loadable = false;
if (runtime_info->IsLoadable(&loadable) == S_OK && loadable) {
if (runtime_info->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&runtime_host)) == S_OK) {
return runtime_host;
}
}
}
}
if (meta_host) {
meta_host->Release();
}
if (runtime_info) {
runtime_info->Release();
}
if (runtime_host) {
runtime_host->Release();
}
return nullptr;
}
extern "C" __declspec(dllexport) int InitCLR() {
if (pCLR) {
MessageBoxA(NULL, "CLR already initialized", "", NULL);
return 1;
}
pCLR = StartCLR(L"v4.0.30319");
if (!pCLR) {
MessageBoxA(NULL, "StartCLR failed", "", NULL);
return 1;
} else {
pCLR->Start();
}
DWORD result = 0;
auto err = pCLR->ExecuteInDefaultAppDomain(managed_DLL_PATH.c_str(), L"Managed.Helpers", L"Say", L"Hello", &result);
if (err != S_OK) {
MessageBoxA(NULL, "ExecuteInDefaultAppDomain failed", "", NULL);
return 1;
}
return 0;
}
extern "C" __declspec(dllexport) int FinitCLR() {
if (!pCLR) {
MessageBoxA(NULL, "CLR is noy initialized", "", NULL);
return 1;
}
DWORD current_appdomain_id = 0;
auto err = pCLR->ExecuteInDefaultAppDomain(managed_DLL_PATH.c_str(), L"Managed.Helpers", L"GetAppdomainId", L"", ¤t_appdomain_id);
if (err != S_OK) {
MessageBoxA(NULL, "ExecuteInDefaultAppDomain(GetAppdomainId) failed", "", NULL);
return 1;
}
err = pCLR->UnloadAppDomain(current_appdomain_id, true);
if (err != S_OK) {
MessageBoxA(NULL, "UnloadAppDomain failed", "", NULL);
return 1;
}
pCLR->Stop();
pCLR->Release();
pCLR = nullptr;
return 0;
}