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 ...
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 –
@Rick, hai mai trovato una buona soluzione per questo? –