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

Вид: 50355|Ответ: 0

[Источник] .NET/C# Emit динамически генерирует сборки

[Скопировать ссылку]
Опубликовано 21.03.2021 12:38:34 | | | |
Сценарии приложений, согласно нашему коду на C#, динамически генерируют EXE, его сценарии применения могут быть очень разными, например, авторизация программного обеспечения, введение информации авторизации, генерация авторизованного DLL и т.д., поэтому как выполнить эту функцию, нужно упомянуть технический Emit.

1. Обзор Emit

Излучение — это можно назвать излучающим или генерирующим. В Framework классы, связанные с Emit, по сути существуют в пространстве имён System.Reflection.Emit. Видно, что Эмит существует как элемент отражения. Говоря о рефлексии, с ней должны быть все ознакомлены — она позволяет нам увидеть элементы сборки, чтобы получить большое количество информации, например, какие типы состоит в сборке, какие методы он содержит и так далее. Но отражения можно только «видеть», тогда как Emit может динамически генерировать код во время выполнения. Давайте посмотрим, как генерировать код с помощью Emit.

2. Сборка и управляемый модуль

Ассемблер — это логическая группа одного или нескольких модулей, файлов ресурсов, а во второй степени ассемблер — это наименьшая единица повторного использования, безопасности и версионирования. DLLs и EXE, которые мы видим, можно назвать ассемблером, ассемблер содержит несколько модулей, но обычно при VS компиляции мы компилируем только один модуль; если мы хотим скомпилировать несколько модулей в ассембле, нужно использовать csc.exe реализацию.

3. Динамическое генерирование операций кода

Во-первых, нам нужно понять, каким типом представлен каждый динамический тип в .NET.

Сборка: System.Reflection.Emit.AssemblyBuilder (определяет и представляет динамические сборки)

Конструктор: System.Reflection.Emit.ConstructorBuilder (конструктор, определяющий и представляющий динамические классы)

Пользовательский атрибут: System.Reflection.Emit.CustomAttributeBuilder (помогает генерировать пользовательские атрибуты с использованием параметров, передаваемых конструктором, для генерации атрибутов классов)

Enum: System.Reflection.Emit.EnumBuilder (объясняет и указывает тип enum)

Событие: System.Reflection.Emit.EventBuilder (событие, определяющее класс)

Поле: System.Reflection.Emit.FieldBuilder (Определяет и представляет поля.) не может наследовать такой класс)

Локальные переменные: System.Reflection.Emit.LocalBuilder (представляет локальные переменные внутри метода или конструктора)

Метод: System.Reflection.Emit.MethodBuilder (метод (или конструктор), определяющий и представляющий динамический класс)

Модуль: System.Reflection.Emit.ModuleBuilder (определяет и представляет модули в динамических сборках)

Параметр: System.Reflection.Emit.ParameterBuilder (создание или связывание информации о параметрах, таких как параметры метода, параметры событий и т.д.)

Свойство: System.Reflection.Emit.PropertyBuilder (Определить тип свойства)

Класс: System.Reflection.Emit.TypeBuilder (определить и создать новый экземпляр класса во время выполнения)

OpCode — это описание директивы промежуточного языка (IL). Для этого много инструкций, вы можете посмотреть официальный сайт Microsoft:Вход по гиперссылке виден.

Ограничения доступа AssemblyBuilderAccess

AssemblyBuilderAccess.Run; Указывает, что сборку можно выполнить, но не сохранить.
AssemblyBuilderAccess.Save; Указывает, что сборку можно сохранить, но не выполнить.
AssemblyBuilderAccess.RunAndSave; Указывает, что сборку можно сохранить и выполнить.
AssemblyBuilderAccess.ReflectionOnly; Указывает, что сборки могут использоваться только в рефлексивном контексте и не могут выполняться.
AssemblyBuilderAccess.RunAndCollect; Означает, что сборку можно разгрузить, а память восстановить.

Код таков:

Сначала используйте emit для генерации кода IL, затем динамически генерируйте ассемблер, а затем загрузите ассемблер и вызваните её методы, как показано на рисунке ниже:



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



(Конец)





Предыдущий:Разница между компилятором Roslyn MSBuild
Следующий:.NET/C# Тестирование производительности отражения, излучения, выражения
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com