我有一个通过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
不要让我们猜你正在询问什么是IID,确切地说当你这样做时。发布您的代码。 –
@HansPassant我已经用代码片段更新了问题。令人惊讶的是,上述代码在我的测试应用程序中正常工作,我在其中明确创建了一个CLR实例。我的意图是在最后一次调用GetCLRManager失败时,锁定本地进程中已经加载的CLR实例。谢谢! – WinCPP