2010-11-01 7 views
2

J'essaye de créer une instance de ICLRAppDomainResourceMonitor interface, mais je n'ai trouvé aucune idée de ce que la coclasse l'implémente. Sans cette connaissance, je ne peux pas créer une instance d'objet de la coclasse et récupérer cette interface à partir de l'objet coclasse.Comment créer une instance de l'interface ICLRAppDomainResourceMonitor?

Quelqu'un peut-il m'aider? Merci beaucoup.

+0

Est-ce via le code managé ou ...? –

+0

@Aaron, via le code natif. – smwikipedia

Répondre

1

Une fois que vous avez un ICLRControl, généré à partir de ICLRRuntimeHost :: GetCLRControl, exécutez ICLRControl :: GetCLRManager en utilisant IID_ICLRAppDomainResourceMonitor pour l'interface souhaitée.

par exemple.

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); 

Modifier: Notez que vous devez utiliser le CLR v4.0 pour que le travail fonctionne. Utiliser les métahost 4.0 et 2.0 n'est pas suffisant.

2

Dans le code ci-dessus, nous pouvons créer une instance de ICLRAppDomainResourceMonitor avec succès.

En fait, j'essaie d'extraire les valeurs des attributs de chaque AppDomain de chaque processus .NET 4.0 s'exécutant sur le même système.

J'ai essayé code suivant pour récupérer les données de 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, mais Monitor-> GetCurrentAllocated (aide, & octets) Valeur retour h comme -2146234348-à-dire COR_E_APPDOMAINUNLOADED

Veuillez nous faire part de vos commentaires.

Merci,

Questions connexes