C++ ICLRRuntimeHost::UnloadAppDomain失败

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是不可能的,如重要部分所述: 此方法不会向主机释放资源、卸载应用程序域或销毁线程。您必须终止进程

我正在尝试将托管c++/cli dll加载到本机进程中,因此我创建了一个启动clr并调用托管dll的引导dll,一切正常,但我无法终止/卸载clr。这是代码。InitCLR和FinitCr由injector调用,调用UnloadAppDomain返回0x801315,GetAppdomainId托管函数是返回AppDomain::CurrentDomain->Id的函数


不幸的是,卸载一次加载的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"", &current_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;
}