2011-02-02 9 views
7

Ho bisogno di ospitare il runtime .NET in un processo non gestito. Ho un codice che funziona per caricare il runtime tramite COM e posso caricare gli assembly nell'AppDomain ed eseguire il codice bene.Creazione di un CLR AppDomain ospitato con autorizzazioni di trust complete compresi i diritti di rete

Tuttavia, ho problemi con le applicazioni che sono ospitate su una condivisione di rete e devo modificare la politica dell'applicazione per farle eseguire che non è un'opzione. Quindi quello che mi piacerebbe fare è impostare il livello di autorizzazione per l'AppDomain principale del runtime su illimitato.

Qualcuno può fornire un esempio su come impostare il livello del criterio AppDomain? Non riesco a capire come istanziare le classi richieste dal codice non gestito per creare il PolicyLevel e gli oggetti correlati e impostare la politica. Fondamentalmente non so quali riferimenti include/namespace ho bisogno di far funzionare questo dal codice C++ che uso.

Ecco il codice che ho a questo punto:

/// Starts up the CLR and creates a Default AppDomain 
DWORD WINAPI ClrLoad(char *ErrorMessage, DWORD *dwErrorSize) 
{ 
    if (spDefAppDomain) 
     return 1; 


    //Retrieve a pointer to the ICorRuntimeHost interface 
    HRESULT hr = CorBindToRuntimeEx(
        ClrVersion, //Retrieve latest version by default 
        L"wks", //Request a WorkStation build of the CLR 
        STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN | STARTUP_CONCURRENT_GC, 
        CLSID_CorRuntimeHost, 
        IID_ICorRuntimeHost, 
        (void**)&spRuntimeHost 
        ); 

    if (FAILED(hr)) 
    { 
     *dwErrorSize = SetError(hr,ErrorMessage); 
     return hr; 
    } 

    //Start the CLR 
    hr = spRuntimeHost->Start(); 

    if (FAILED(hr)) 
     return hr; 

    CComPtr<IUnknown> pUnk; 

    //Retrieve the IUnknown default AppDomain 
    //hr = spRuntimeHost->GetDefaultDomain(&pUnk); 
    //if (FAILED(hr)) 
    // return hr; 


    WCHAR domainId[50]; 
    swprintf(domainId,L"%s_%i",L"wwDotNetBridge",GetTickCount()); 
    hr = spRuntimeHost->CreateDomain(domainId,NULL,&pUnk); 

    hr = pUnk->QueryInterface(&spDefAppDomain.p); 
    if (FAILED(hr)) 
     return hr; 

     // // Create a new AppDomain PolicyLevel. 
    //PolicyLevel polLevel = PolicyLevel:: CreateAppDomainLevel(); 

    //// Create a new, empty permission set. 
    // PermissionSet permSet = gcnew PermissionSet(PermissionState::Unrestricted); 

    //// Add permission to execute code to the permission set. 
    //permSet->AddPermission(gcnew SecurityPermission(SecurityPermissionFlag::Execution)); 

    ////// Give the policy level's root code group a new policy statement based 
    ////// on the new permission set. 
    ////polLevel->RootCodeGroup->PolicyStatement = gcnew PolicyStatement(permSet); 

    //// Give the new policy level to the application domain. 
    //spDefAppdomain->SetAppDomainPolicy(polLevel); 



    return 1; 
} 

ho raccolto alcuni esempi di codice (commentato) che sembra fare quello che ho bisogno di, ma non riesco a capire che cosa lib/include riferimenti Ho bisogno di fare i riferimenti di tipo per PermissionSet e PolicyLevel funzionano.

Tutte le idee molto apprezzate ...

+0

Penso che è necessario ICLRControl :: SetAppDomainManagerType() per impostare un gestore di dominio di applicazione personalizzata. Il miglior link che ho trovato era http://blogs.msdn.com/b/dparys/archive/2007/07/20/common-language-runtime-hosting.aspx –

+0

@Rick, hai mai trovato una buona soluzione per questo? –

risposta

2

Penso che è necessario utilizzare il metodo "non banale" di creare un AppDomain al fine di arrivare a nulla di tutto ciò la bontà:

  • CreateDomainSetup(IUnknown** pAppDomainSetup), ti restituirà un'istanza IAppDomainSetup.
  • riempimento che in modo appropriato (credo che tutte le cose della politica è disponibile in là)
  • Usa CreateDomainEx, passando l'istanza configurazione inizializzata come secondo parametro
  • profitto?

Riferimenti:

Problemi correlati