COM 相互運用機能を介して .NET コンポーネントを使用するネイティブ プロセスがあります。プロセスが起動したら、ICLRControl インターフェイス ポインターを使用して、ICLRDebugManager、ICLRGCManager などのさまざまな CLR マネージャーへのインターフェイス ポインターを取得しようとしています。問題なく ICLRControl インターフェイスを取得することができました。ICLRRuntimeInfo は、GetVersionString を呼び出すと、4.0.x .net バージョンであることも正しく示しています。
ICLRControl::GetCLRManager がエラー 0x80130122 で失敗し続けることだけです。このエラー コードは HOST_E_INVALIDOPERATION を表します。インターネットを検索しましたが、これが失敗する理由に関する情報を取得できませんでした。どんな助けでも大歓迎です。
ティア。
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