Системы. Рефлексия ion. Класс Emit.DynamicMethod

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Класс можно использовать DynamicMethod для создания и выполнения метода во время выполнения, не создавая динамическую сборку и динамический тип для хранения метода. Исполняемый код, созданный JIT-компилятором, освобождается при DynamicMethod повторном удалении объекта. Динамические методы являются наиболее эффективным способом создания и выполнения небольших объемов кода.

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

  • Если динамический метод размещен анонимно, он находится в предоставленной системой сборке и поэтому изолирован от другого кода. По умолчанию у него нет доступа к недоступным данным. Анонимный динамический метод может иметь ограниченную возможность пропуска видимости JIT-компилятора проверка, если он был предоставлен ReflectionPermission с флагомReflectionPermissionFlag.RestrictedMemberAccess. Уровень доверия сборки, к которым обращаются не открытые члены динамического метода, должен быть равным или подмножество уровня доверия стека вызовов, который вызвал динамический метод. Дополнительные сведения об анонимных динамических методах см. в пошаговом руководстве. Создание кода в сценариях частичного доверия.

  • Если динамический метод связан с указанным модулем, динамический метод фактически глобальный для этого модуля. Он может получить доступ ко всем типам в модуле и всем internal (Friend в Visual Basic) членам типов. Динамический метод можно связать с любым модулем независимо от того, был ли создан модуль, при условии, что требование к ReflectionPermissionRestrictedMemberAccess флагу может быть удовлетворено стеком вызовов, включающим код. ReflectionPermissionFlag.MemberAccess Если флаг включен в грант, динамический метод может пропустить видимость JIT-компилятора проверка и получить доступ к частным данным всех типов, объявленных в модуле или любом другом модуле в любой сборке.

    Примечание.

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

  • Если динамический метод связан с указанным типом, он имеет доступ ко всем элементам типа независимо от уровня доступа. Кроме того, можно пропустить проверка видимости JIT. Это дает динамический метод доступа к частным данным других типов, объявленных в том же модуле или в любом другом модуле в любой сборке. Динамический метод можно связать с любым типом, но код должен быть предоставлен ReflectionPermission как с флагами, так RestrictedMemberAccess и MemberAccess с флагами.

В следующей таблице показано, какие типы и члены доступны для анонимно размещенного динамического метода с проверка JIT и без них, в зависимости от того, предоставляется ли ReflectionPermission флагRestrictedMemberAccess.

Видимость проверка Без добавления RestrictedMemberAccess С добавлением RestrictedMemberAccess
Без пропуска проверка видимости JIT Общедоступные члены общедоступных типов в любой сборке. Общедоступные члены общедоступных типов в любой сборке.
Пропуск проверка видимости JIT с ограничениями Общедоступные члены общедоступных типов в любой сборке. Все члены всех типов, только в сборках, уровни доверия которых равны или меньше уровня доверия сборки, которая генерирует динамический метод.

В следующей таблице показано, какие типы и члены доступны динамическому методу, связанному с модулем или типом в модуле.

Пропуск проверка видимости JIT Связанный с модулем Связанный с типом
No Общедоступные и внутренние члены общедоступных, внутренних и частных типов в модуле.

Общедоступные члены общедоступных типов в любой сборке.
Все члены связанного типа. Общедоступные и внутренние члены всех других типов в модуле.

Общедоступные члены общедоступных типов в любой сборке.
Да Все члены всех типов в любой сборке. Все члены всех типов в любой сборке.

Динамический метод, связанный с модулем, имеет разрешения этого модуля. Динамический метод, связанный с типом, имеет разрешения модуля, содержащего этот тип.

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

Хотя динамические методы являются static методами (Shared методами в Visual Basic), расслабленные правила для привязки делегата позволяют динамическому методу быть привязанным к объекту, чтобы он действовал как метод экземпляра при вызове с помощью этого экземпляра делегата. Пример, демонстрирующий это, предоставляется для перегрузки CreateDelegate(Type, Object) метода.

Проверка

В следующем списке приведены условия, в которых динамические методы могут содержать неподвержимый код. (Например, динамический метод не проверяется, если его InitLocals свойство имеет значение false.)

  • Динамический метод, связанный с критической для безопасности сборкой, также является критически важным для безопасности и может пропустить проверку подлинности. Например, сборка без атрибутов безопасности, выполняемая в качестве классического приложения, рассматривается как критически важное для среды выполнения. При связывании динамического метода с сборкой динамический метод может содержать неподверяемый код.
  • Если динамический метод, содержащий неподключаемый код, связан с сборкой с прозрачностью уровня 1, компилятор JIT внедряет требование безопасности. Запрос завершается успешно, только если динамический метод выполняется полностью доверенным кодом. См . прозрачный код безопасности, уровень 1.
  • Если динамический метод, содержащий неподдерживаемый код, связан с сборкой с уровнем прозрачности 2 (например, mscorlib.dll), он создает исключение (внедренное компилятором JIT) вместо того, чтобы требовать безопасность. См . прозрачный код безопасности, уровень 2.
  • Анонимный динамический метод, содержащий неподключаемый код, всегда вызывает исключение. Он никогда не может пропускать проверку, даже если она создана и выполняется полностью доверенным кодом.

Исключение, которое возникает для непроверяемого кода, зависит от способа вызова динамического метода. При вызове динамического метода с помощью делегата, возвращаемого из CreateDelegate метода, VerificationException создается исключение. При вызове динамического метода с помощью Invoke метода TargetInvocationException создается внутренний VerificationExceptionобъект.