2011-01-28 3 views
11

Я работаю через Microsoft .Net Framework - Фонд разработки приложений Training Kit Книга Глава 8 Урок 2: Настройка приложений ДоменыИщу альтернативу AppDomain.CreateDomain (строка, доказательств) в связи с устаревшей политики CAS

ShowWinIni быть имя сборки для программы я хочу, чтобы выполнить

object[] hostEvidence = { new Zone(SecurityZone.MyComputer) }; 
Evidence e = new Evidence(hostEvidence, null); 

// Create an AppDomain. 
AppDomain d = AppDomain.CreateDomain("New Domain", e); 

// Run the assembly 
d.ExecuteAssemblyByName("ShowWinIni"); 

Когда я выполняю:

AppDomain d = AppDomain.CreateDomain("New Domain", e); 

я получаю следующее сообщение: «Этот метод неявно использует политику CAS, которая устарела .NET Framework. Чтобы включить политику CAS по причинам совместимости, используйте переключатель конфигурации NetFx40_LegacySecurityPolicy. Пожалуйста, смотрите http://go.microsoft.com/fwlink/?LinkID=155570 для получения дополнительной информации.»

Я могу выполнить сборку штраф, когда я создаю AppDomain без объекта Evidence.

Конечно, я посетил http://go.microsoft.com/fwlink/?LinkID=155570, но я до сих пор путают о том, как создать приложение домен с заданными правами.

Следующим наиболее полезным сайтом я нашел http://msdn.microsoft.com/en-us/library/bb763046.aspx но мой объект StrongName вычисляет на NULL.

StrongName fullTrustAssembly = 
    typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>(); 

передающихся имя класса, реализующего весь этот код.

Заранее благодарим за советы и советы!

ответ

11

Я нашел способ сделать пример исходного кода работать без необходимости использования 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 в Интернете, он будет пытаться использовать Снятые с политикой безопасности CAS приводит в NotSupportedException. Я хочу, чтобы SecurityException ... означало, что сборка, которую я хочу выполнить, не имеет необходимых ей разрешений.

Чтобы выполнить сборку в AppDomain с ограниченными разрешениями, вам необходимо использовать песочницу. Лучший пример песочницы я нашел здесь: 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 = строковое представление имени сборки

7

После обращения за помощью к коллегам я получил эту работу.

Очевидно, что упражнение книги было разработано для использования в каркасе 3.5 .Net, в то время как я использую 4.0. После изменения как моего проекта, так и свойств проекта ShowWinIni использовать фреймворк 3.5 все сработало ... но я все еще хотел сделать эту работу с фреймворком 4.0.

Чтобы решить следующее сообщение:.. «Этот метод неявно использует CAS политику, которая была Снятые с помощью .NET Framework Для того чтобы политики CAS по соображениям совместимости, пожалуйста, используйте переключатель конфигурации NetFx40_LegacySecurityPolicy Пожалуйста см http://go.microsoft.com/fwlink/?LinkID=155570 для больше информации."

Я создал файл app.config и добавил к нему следующий:

<configuration> 
    <runtime> 
     <NetFx40_LegacySecurityPolicy enabled="true"/> 
    </runtime> 
</configuration> 

Вы можете прочитать больше о NetFx40_LegacySecurityPolicy на http://msdn.microsoft.com/en-us/library/dd409253.aspx

Это в конечном итоге делает мою программу ненадежного приложения, бросание безопасности Исключение при попытке отладки. Чтобы снова сделать мое приложение надежным, я включил параметры безопасности ClickOnce и пометил «Это приложение полного доверия» в свойствах моего проекта.

На данный момент, я мог отлаживать программу, но исключение безопасности теперь бросает, когда я выполнил это заявление:

d.ExecuteAssemblyByName("ShowWinIni"); 

Это заявление работало отлично, прежде чем я начал пытаться включить объект Evidence, когда я создал мой объект AppDomain. Ну, оказывается, есть еще один метод ... AppDomain.ExecuteAssemblyByName (строка, доказательство), вы можете прочитать примерно в http://msdn.microsoft.com/en-us/library/5kd4z003.aspx. Таким образом, я заменил приведенный выше фрагмент кода следующим образом:

d.ExecuteAssemblyByName("ShowWinIni", e); 

'e' являющийся объектом моего доказательства, созданным в моем первоначальном вопросе.

Теперь я НЕ думаю, что это лучшее решение. В идеале я бы предпочел не заставить мою программу использовать NetFx40_LegacySecurityPolicy, и я считаю, что приложения реального мира не должны полагаться на устаревшие методы. Я думал, что это решение стоит опубликовать, если кто-то будет работать через ту же книгу, что и я.

 Смежные вопросы

  • Нет связанных вопросов^_^