2013-10-10 129 views
3

我有一个通过COM interop使用.NET组件的本机进程。一旦进程结束,我试图使用ICLRControl接口指针来获取指向各种CLR管理器的接口指针,例如ICLRDebugManager,ICLRGCManager等。我能够达到无故障获取ICLRControl接口。当我调用GetVersionString时,ICLRRuntimeInfo也正确告诉我它是4.0.x.net版本。CLR ICLRControl :: GetCLRManager失败,出现错误HOST_E_INVALIDOPERATION

只是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 
+0

不要让我们猜你正在询问什么是IID,确切地说当你这样做时。发布您的代码。 –

+1

@HansPassant我已经用代码片段更新了问题。令人惊讶的是,上述代码在我的测试应用程序中正常工作,我在其中明确创建了一个CLR实例。我的意图是在最后一次调用GetCLRManager失败时,锁定本地进程中已经加载的CLR实例。谢谢! – WinCPP

回答

1

看着this source code在GitHub上,它看起来像CCorCLRControl::GetCLRManager将返回HOST_E_INVALIDOPERATION如果运行时已经开始。

这就解释了为什么在尝试“锁定到已经加载的CLR实例”时收到错误代码,但是您在明确创建CLR实例时遇到了成功问题。

相关问题