Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 50355|Отговор: 0

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

[Копирай линк]
Публикувано на 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# Рефлексия, излъчване, тестване на производителността на експресия
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com