3

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

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

TIA。

WinCPP

编辑 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
4

1 回答 1

1

查看 GitHub 上的这个源代码,如果运行时已经启动,它看起来CCorCLRControl::GetCLRManager会返回。HOST_E_INVALIDOPERATION

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

于 2017-06-29T05:31:46.783 回答