|
|
Публикувано на 21.03.2021 12:38:34
|
|
|
|

Сценариите на приложението, според нашия C# код, динамично генерират EXE, а неговите приложни сценарии могат да бъдат много много, като софтуерна авторизация, можете да въведете информацията за авторизация, да генерирате оторизиран DLL и т.н., така че как да се постигне тази функция, трябва да споменем технически Emit.
1. Преглед на Emit
Емит, може да се нарече емитация или генериране. Във Framework класовете, свързани с Emit, основно съществуват под пространството на имената System.Reflection.Emit. Може да се види, че Емит съществува като елемент на размисъл. Говорейки за рефлексия, всеки трябва да е запознат с нея, тя ни позволява да видим елементите на сглобката, за да получим голямо количество информация като какви типове съдържа асемблерата, какви методи съдържа типът и т.н. Но отраженията могат само да се "виждат", докато Emit може динамично да генерира код по време на изпълнение. Нека разгледаме как да генерираме код с Emit.
2. Сглобяване и управляван модул
Асемблерът е логическа група от един или повече модули, файлове с ресурси, а второстепенно асемблерът е най-малката единица за повторна употреба, сигурност и версиониране. DLL-овете и 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; Означава, че асемблерът може да бъде разтоварен и паметта да бъде възстановена.
Кодът е следният:
Първо използвайте емит, за да генерирате IL код, след това динамично генерирайте асемблер, и накрая заредете асемблера и извикайте нейните методи, както е показано на фигурата по-долу:
Използвайте ILSpy, за да видите генерирания код, както е показано на изображението по-долу:
(Край)
|
Предишен:Разликата между компилатора Roslyn MSBuildСледващ:.NET/C# Рефлексия, излъчване, тестване на производителността на експресия
|