Я нашел способ заставить исходный пример кода работать без необходимости включать NetFX40_LegacySecurityPolicy.
EvidenceBase[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);
AppDomain d = AppDomain.CreateDomain("New Domain", e);
d.ExecuteAssemblyByName("ShowWinIni");
Это не будет работать, если вы измените SecurityZone на Internet, он попытается использовать устаревшую защиту CASполитика, приводящая к NotSupportedException.Что я хочу, так это SecurityException ... это означает, что сборка, которую я хочу выполнить, не имеет необходимых разрешений.
Чтобы выполнить сборку в домене приложения с ограниченными разрешениями, вам нужно использовать изолированную программную среду.Лучший пример песочницы, который я нашел, находится здесь: http://www.simple -talk.com / dotnet / .net-framework / whats-new-in-code-access-security-in-.net-framework-4.0---part-i /
Я думаю, что эта страница также очень хорошо объясняет изменения, внесенные в CAS в 4.0!
Многие источники, включая MSDN, убедили меня, что мне нужно предоставитьМассив StrongName при вызове:
AppDomain.CreateDomain( string friendlyName,
Evidence securityInfo,
AppDomainSetup info,
PermissionSet grantSet,
params StrongName[] fullTrustAssemblies);
Как указано в моем исходном сообщении, у меня были (и остаются) проблемы с получением объекта StrongName вместо null
.Оказывается, мне это даже не нужно!
Это мой законченный пример для песочницы:
Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev);
AppDomainSetup adSetup = new AppDomainSetup();
adSetup.ApplicationBase = Path.GetFullPath(pathToUntrusted);
AppDomain newDomain = AppDomain.CreateDomain("Sandbox Domain", null, adSetup, internetPS);
newDomain.ExecuteAssemblyByName(untrustedAssembly);
pathToUntrusted
= строковое представление пути к файлу для моей сборки
untrustedAssembly
= строковое представление имени сборки