Tôi cần lưu trữ thời gian chạy .NET trong một quy trình không được quản lý. Tôi có mã hoạt động để tải thời gian chạy thông qua COM và tôi có thể tải hội đồng vào AppDomain và thực thi mã chỉ tốt.Tạo một CLR AppDomain được lưu trữ với quyền tin cậy đầy đủ bao gồm quyền mạng
Tuy nhiên, tôi gặp phải sự cố với các ứng dụng được lưu trữ trên mạng chia sẻ và phải thay đổi chính sách ứng dụng để chúng thực thi không phải là tùy chọn. Vì vậy, những gì tôi muốn làm là thiết lập mức cấp phép cho AppDomain chính của thời gian chạy thành không hạn chế.
Ai đó có thể cung cấp ví dụ về cách đặt cấp chính sách AppDomain không? Tôi không thể tìm ra cách khởi tạo các lớp được yêu cầu từ mã không được quản lý để tạo ra các đối tượng PolicyLevel và liên quan và thiết lập chính sách. Về cơ bản tôi không biết những gì bao gồm/tài liệu tham khảo không gian tên tôi cần để có được điều này để làm việc từ mã C + + tôi sử dụng.
Dưới đây là đoạn code tôi có vào thời điểm này:
/// 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;
}
Tôi nhặt một số mẫu mã (nhận xét) xuất hiện để làm những gì tôi cần nó, nhưng tôi không thể tìm ra những gì lib/include tài liệu tham khảo Tôi cần phải thực hiện các loại tài liệu tham khảo cho PermissionSet và PolicyLevel làm việc.
Bất kỳ ý tưởng nhiều đánh giá cao ...
tôi nghĩ rằng bạn cần ICLRControl :: SetAppDomainManagerType() để thiết lập một nhà quản lý tùy chỉnh appdomain. Liên kết tốt nhất tôi tìm thấy là http://blogs.msdn.com/b/dparys/archive/2007/07/20/common-language-runtime-hosting.aspx –
@Rick, bạn đã bao giờ nhận được giải pháp tốt cho điều này chưa? –