.net 如何创建ICLRAppDomainResourceMonitor接口的实例?

.net 如何创建ICLRAppDomainResourceMonitor接口的实例?,.net,clr,.net,Clr,我试图创建一个接口实例,但我没有发现任何关于coclass实现它的线索。没有这些知识,我无法创建coclass的对象实例并从coclass对象检索接口 有人能帮我吗?非常感谢。一旦您拥有了从ICLRRuntimeHost::GetCLRControl生成的ICLRControl,请使用IID_ICLRAppDomainResourceMonitor为所需接口执行ICLRControl::GetCLRManager e、 g 编辑:注意,您必须使用CLR v4.0才能使工作。使用4.0元主机和2.

我试图创建一个接口实例,但我没有发现任何关于coclass实现它的线索。没有这些知识,我无法创建coclass的对象实例并从coclass对象检索接口


有人能帮我吗?非常感谢。

一旦您拥有了从ICLRRuntimeHost::GetCLRControl生成的ICLRControl,请使用IID_ICLRAppDomainResourceMonitor为所需接口执行ICLRControl::GetCLRManager

e、 g


编辑:注意,您必须使用CLR v4.0才能使工作。使用4.0元主机和2.0运行时是不够的。

在上面的代码中,我们可以成功创建ICLRAppDomainResourceMonitor的实例

实际上,我正在尝试获取运行在同一系统上的每个.NET4.0进程的每个AppDomain的属性值

我尝试了以下代码来获取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();
}

但是APImonitor->GetCurrentAllocated(Aid,&bytes)将hr的值返回为-21462348 ie

请提供您的意见


谢谢,

这是通过托管代码还是…?@Aaron,通过本机代码。
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();