我有一个通过 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