CLR ICLRControl::GetCLRManager 失败,错误HOST_E_INVALIDOPERATION

CLR ICLRControl::GetCLRManager fails with error HOST_E_INVALIDOPERATION

本文关键字:HOST INVALIDOPERATION 错误 ICLRControl GetCLRManager 失败 CLR      更新时间:2023-10-16

我有一个本机进程,它通过COM互操作使用.NET组件。一旦该过程完成,我正在尝试使用 ICLRControl 接口指针获取指向各种 CLR 管理器(如 ICLRDebugManager、ICLRGCManager 等(的接口指针。我能够毫无故障地获取ICLRControl接口。ICLRRuntimeInfo还正确地告诉我,当我调用GetVersionString时,它是4.0.x .net版本。

只是ICLRControl::GetCLRManager不断失败,错误0x80130122,错误代码代表HOST_E_INVALIDOPERATION。搜索了互联网,但无法获得有关为什么这可能失败的信息。任何帮助都非常感谢。

蒂亚。

温菲普

编辑 1.添加代码片段。

    // ICLRRuntimeInfo interface pointer
    CComQIPtr<ICLRRuntimeInfo> pCLRRuntimeInfo = pUnk;
    if (!pCLRRuntimeInfo)
    {
        cout << "failed to get run time info interface pointer" << endl;
        return;
    }
    TCHAR version[128];
    memset(version, 0, 128);
    DWORD count = 127;
    pCLRRuntimeInfo->GetVersionString(version, &count);
    cout << version << endl;
    // ICLRRuntimeHost
    CComPtr<ICLRRuntimeHost> pCLRRuntimeHost = 0;
    hr = pCLRRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID *)&pCLRRuntimeHost);
    if (FAILED(hr))
    {
        cout << "failed to get run time host interface pointer" << endl;
        return;
    }
    // ICLRControl
    CComPtr<ICLRControl> pCLRControl = 0;
    hr = pCLRRuntimeHost->GetCLRControl(&pCLRControl);
    if (FAILED(hr))
    {
        cout << "failed to get clr control interface pointer" << endl;
        return;
    }
    ///////////////////////////////////////////
    // Everything is successful upto this point
    ///////////////////////////////////////////
    // ICLRGCManager
    CComPtr<ICLRGCManager> pCLRGCManager = 0;
    hr = pCLRControl->GetCLRManager(IID_ICLRGCManager, (LPVOID *)&pCLRGCManager);
    if (FAILED(hr))
    {
        cout << "failed to get GC manager interface pointer" << endl;
        return;
    }
    // Above call fails with the error 0x81031022, though everything is as per the MSDN documentation for the API

在 GitHub 上查看此源代码,如果运行时已经启动,看起来CCorCLRControl::GetCLRManager将返回HOST_E_INVALIDOPERATION

这就解释了为什么您在尝试"锁定已加载的 CLR 实例"时收到该错误代码,但在显式创建 CLR 实例时却成功