Системы. Рефлексия 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объект.