Как создать экземпляр интерфейса ICLRAppDomainResourceMonitor? - PullRequest
2 голосов
/ 01 ноября 2010

Я пытаюсь создать экземпляр интерфейса ICLRAppDomainResourceMonitor , но я не нашел ни малейшего представления о том, что Coclass реализует его.Без этого знания я не могу создать экземпляр объекта Coclass и извлечь этот интерфейс из объекта Coclass.

Может ли кто-нибудь помочь мне в этом?Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

В приведенном выше коде мы можем успешно создать экземпляр ICLRAppDomainResourceMonitor.

На самом деле я пытаюсь получить значения атрибутов каждого AppDomain каждого из процессов .NET 4.0, работающих в той же системе.

Я попытался следующий код для получения данных AppDomain:

void getAttributeValues(struct processIDMap *NETProcessID){ //NETProcessID is collection of .NET 4.0 process running on system

    ICorPublishAppDomain* appDomains[1];
    ULONG aFetched = 1;

    ICLRMetaHost *meta = NULL;
    ICLRRuntimeInfo *info = NULL;
    ICLRRuntimeHost *host = NULL;
    ICLRControl *control = NULL;
    ICLRAppDomainResourceMonitor *monitor = NULL;


    hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (void **)&meta);
    if (! SUCCEEDED(hr))
        printf("hr failed....");


    struct processIDMap *tempStruct = NETProcessID;

    while(tempStruct != NULL ){

        HANDLE pHandle = NULL;
        IEnumUnknown * pRtEnum = NULL;

        DWORD Aid = 0;
        ULONGLONG bytes = 0;
        ULONG fetched = 0;

        pHandle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,tempStruct->PID);
        hr = meta->EnumerateLoadedRuntimes(pHandle, &pRtEnum);
        if (! SUCCEEDED(hr))
            printf("hr failed....");

        while ((hr = pRtEnum->Next(1,(IUnknown **)&info,&fetched)) == S_OK && fetched > 0){


            hr = info->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (void **)&host);
            if (! SUCCEEDED(hr))
                printf("hr failed....");

            hr = host->GetCLRControl(&control); 
            if (! SUCCEEDED(hr))
                printf("hr failed....");

            hr = control->GetCLRManager(IID_ICLRAppDomainResourceMonitor, (void **)&monitor);
            if (! SUCCEEDED(hr))
                printf("hr failed....");

            hr = monitor->GetCurrentAllocated(Aid, &bytes);
            if (! SUCCEEDED(hr))
                printf("hr failed....");

        }

        //info->Release();
        //control->Release();
        //monitor->Release();
        //host->Release();

        tempStruct = tempStruct->next;
        pRtEnum->Release();
        CloseHandle(pHandle);


    }

    meta->Release();

}

но API monitor-> GetCurrentAllocated (Aid, & bytes) возвращаемое значение hr как -2146234348, т.е. COR_E_APPDOMAINUNLOADED

Пожалуйста, предоставьте ваши комментарии.

Спасибо

1 голос
/ 01 ноября 2010

Получив ICLRControl, сгенерированный из ICLRRuntimeHost :: GetCLRControl, выполните ICLRControl :: GetCLRManager, используя IID_ICLRAppDomainResourceMonitor для требуемого интерфейса.

, например

ICLRMetaHost *meta;
ICLRRuntimeInfo *info;
ICLRRuntimeHost *host;
ICLRControl *control;
ICLRAppDomainResourceMonitor *monitor;
CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (void **)&meta);
meta->GetRuntime(L"v4.0.30319", IID_CLRRuntimeInfo, (void **)&runtime);
info->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (void **)&host);
host->GetCLRControl(&control);
control->GetCLRManager(IID_ICLRAppDomainResourceMonitor, (void **)&monitor);

//  ... rest of CLR startup ...

unsigned long long bytes;
monitor->GetCurrentAllocated(1, &bytes);

Изменить: Обратите внимание, что вы должны использовать CLR v4.0 для работы. Использование мета-хоста 4.0 и среды выполнения 2.0 недостаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...