|
|
Опубликовано 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# Тестирование производительности отражения, излучения, выражения
|