|
|
Opublikowano 2021-3-21 12:38:34
|
|
|
|

Scenariusze aplikacji, dzięki naszemu kodowi C#, dynamicznie generują EXE, a scenariusze aplikacji mogą być bardzo różnorodne, takie jak autoryzacja oprogramowania, możliwość wprowadzenia informacji autoryzujących, wygenerowania autoryzowanego DLL itd., więc jak osiągnąć tę funkcję, musimy wspomnieć o technicznym Emit.
1. Przegląd Emit
Emit, można nazwać emisją lub generacją. W Frameworku klasy związane z Emit zasadniczo istnieją w przestrzeni nazw System.Reflection.Emit. Można zauważyć, że Emit istnieje jako element refleksji. Mówiąc o refleksji, każdy powinien ją znać – pozwala nam przeglądać elementy asambleru, aby uzyskać dużą ilość informacji, takich jak typy zawierane przez asembler, jakie metody zawiera typ i tak dalej. Ale odbicia można tylko "zobaczyć", podczas gdy Emit może dynamicznie generować kod w czasie działania. Przyjrzyjmy się, jak generować kod za pomocą Emit.
2. Moduł montażowy i zarządzany
Asembler to logiczne połączenie jednego lub więcej modułów, plików zasobów, a w drugiej kolejności asembler jest najmniejszą jednostką ponownego użycia, bezpieczeństwa i wersjonowania. DLL i pliki EXE, które widzimy, można nazwać asemblem, asembl zawiera wiele modułów, ale zazwyczaj, gdy kompilujemy w VS, kompilujemy tylko jeden moduł, jeśli chcemy kompilować wiele modułów w asemblerze, musimy użyć csc.exe implementacji.
3. Dynamicznie generuj operacje kodowe
Najpierw musimy zrozumieć, jakim typem jest reprezentowany każdy dynamiczny typ w .NET.
Assembly: System.Reflection.Emit.AssemblyBuilder (definiuje i reprezentuje dynamiczne zespoły)
Konstruktor: System.Reflection.Emit.ConstructorBuilder (konstruktor definiujący i reprezentujący klasy dynamiczne)
Własny atrybut: System.Reflection.Emit.CustomAttributeBuilder (pomaga generować własne atrybuty na podstawie parametrów przekazywanych przez konstruktora do generowania atrybutów dla klas)
Enum: System.Reflection.Emit.EnumBuilder (wyjaśnia i wskazuje typ enum)
Zdarzenie: System.Reflection.Emit.EventBuilder (zdarzenie definiujące klasę)
Pole: System.Reflection.Emit.FieldBuilder (Definiuje i reprezentuje pola.) nie może odziedziczyć takiej klasy)
Zmienne lokalne: System.Reflection.Emit.LocalBuilder (reprezentuje zmienne lokalne w obrębie metody lub konstruktora)
Metoda: System.Reflection.Emit.MethodBuilder (metoda (lub konstruktor), który definiuje i reprezentuje klasę dynamiczną)
Moduł: System.Reflection.Emit.ModuleBuilder (definiuje i reprezentuje moduły w dynamicznych zespołach)
Parametr: System.Reflection.Emit.ParameterBuilder (utwórz lub skojarz informacje parametrów, takie jak parametry metody, parametry zdarzeń itp.)
Własność: System.Reflection.Emit.PropertyBuilder (Definiuj typ właściwości)
Klasa: System.Reflection.Emit.TypeBuilder (zdefiniuj i utwórz nową instancję klasy w czasie działania)
OpCode to opis dyrektywy języka pośredniego (IL). Jest wiele instrukcji do tego zadania, możesz sprawdzić oficjalną stronę Microsoftu:Logowanie do linku jest widoczne.
Ograniczenia dostępu AssemblyBuilderAccess
AssemblyBuilderAccess.Run; Wskazuje, że montaż można wykonać, ale nie uratować. AssemblyBuilderAccess.Save; Wskazuje, że montaż można zapisać, ale nie wykonać. AssemblyBuilderAccess.RunAndSave; Wskazuje, że asemblacja może być zapisana i wykonana. AssemblyBuilderAccess.ReflectionOnly; Wskazuje, że zespoły mogą być używane tylko w kontekście refleksyjnym i nie mogą być wykonywane. AssemblyBuilderAccess.RunAndCollect; Wskazuje, że zespół może zostać rozładowany, a pamięć odzyskana.
Kod jest następujący:
Najpierw użyj emit do wygenerowania kodu IL, następnie dynamicznie wygeneruj asemble, a na końcu załaduj asembler i wywołaj jego metody, jak pokazano na poniższym rysunku:
Użyj ILSpy, aby zobaczyć wygenerowany kod widoczny na poniższym obrazku:
(Koniec)
|
Poprzedni:Różnica między kompilatorem Roslyn MSBuildNastępny:.NET/C# Testowanie wydajności odbicia, emitowania, ekspresji
|