Выпуск декларативных атрибутов безопасности

Выпуск декларативных атрибутов безопасности для динамических сборок и их типов и методов по функциям соответствует кодированию объявлений .permission и .permissionset для Ilasm.exe (ассемблер MSIL) или применению атрибута PermissionSetAttribute в исходном коде для языков Visual Basic, C# и C++. Однако существуют отличие между форматом метаданных, используемым для сохранения выпущенных атрибутов, и форматом, используемым для хранения скомпилированных атрибутов, в зависимости от версии .NET Framework.

Форматы метаданных для декларативной безопасности

Новый формат метаданных для хранения атрибутов декларативной безопасности был представлен в изменениях 2005 года, затронувших стандарт ECMA и относившихся к исходному XML-формату. Подробности см. в описании большого двоичного объекта PermissionSet в таблице DeclSecurity (раздел 22.11 в изменениях 2005 года) документации ECMA, часть II. Документация доступна через Интернет; см. статью ECMA C# и стандарты общеязыковой инфраструктуры на веб-сайте MSDN и документ Стандарт ECMA-335 - общеязыковая инфраструктура (CLI) на веб-сайте Ecma International.

Во всех версиях .NET Framework декларативная безопасность, примененная с помощью порождения отражения, сохраняется в старом формате метаданных.

Разрешения декларативной безопасности в коде, скомпилированном с помощью Ilasm.exe (ассемблер MSIL) и компиляторов языка в .NET Framework версии 2.0, хранятся в новом формате.

Разрешения декларативной безопасности в коде, скомпилированном с помощью Ilasm.exe (ассемблер MSIL) и компиляторов языка в .NET Framework версий 1.0 и 1.1, хранятся в старом формате.

Выпуск атрибутов декларативной безопасности

Атрибуты декларативной безопасности могут быть выпущены для сборок, типов, методов и конструкторов. Для всех типов элементов декларативная безопасность выпускается дл базовых методов.

Важное примечаниеВажно

Невозможно выпустить атрибуты декларативной безопасности посредством создания объектов PermissionSetAttribute и применения их к динамической сборке, типу или методу посредством использования метода SetCustomAttribute.

  • Чтобы выпустить декларативную безопасность динамической сборки, создайте отдельные объекты PermissionSet, содержащие разрешения, которые являются необходимыми, дополнительными и отклоненными. Передайте эти наборы разрешений в соответствующую перегрузку метода DefineDynamicAssembly. Если отсутствуют разрешения, которые можно применить к категории, укажите для этого параметра значение null.

    Важное примечаниеВажно

    Требуемые, дополнительные и отклоненные разрешения не используются, если только динамическая сборка не была сохранена и повторно загружена в память или если не используется перегрузка метода DefineDynamicAssembly, в которой указано свидетельство и требуемые разрешения, и не предоставляется объект Evidence.Дополнительные сведения см. в разделе DefineDynamicAssembly.

  • Чтобы выпустить декларативную безопасность для типов, методов и конструкторов в динамической сборке, создайте объект PermissionSet, содержащий разрешения для каждого применяемого SecurityAction. Примените разрешения с помощью метода AddDeclarativeSecurity класса TypeBuilder для типов, метода AddDeclarativeSecurity класса ConstructorBuilder для конструкторов и метода AddDeclarativeSecurity класса MethodBuilder для методов.

    ПримечаниеПримечание

    Декларативная безопасность не поддерживается для динамических методов, определенных при помощи класса DynamicMethod.

  • Чтобы выпустить декларативную безопасность для всех прочих свойств и событий, примените необходимые наборы разрешений к базовому методу или методам с помощью метода AddDeclarativeSecurity класса MethodBuilder. Например, чтобы выпустить декларативную безопасность для свойства, примените декларативную безопасность к методам доступа get и set этого свойства.

В процессе разработки кода, создающего динамические сборки, рекомендуется использовать перегрузку метода DefineDynamicAssembly, задающую свидетельство и разрешения, предоставлять свидетельство, которое должна иметь динамическая сборка, и включать SecurityPermissionFlag.SkipVerification в refusedPermissions. Отказ в использовании SkipVerification гарантирует проверку MSIL. Ограничением этой методики является то, что она вызывает создание исключения SecurityException, когда используется с кодом, требующим полного доверия.

См. также

Ссылки

DefineDynamicAssembly

ConstructorBuilder

TypeBuilder

MethodBuilder

PermissionSet