Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 50355|Odpowiedź: 0

[Źródło] .NET/C# Emit generuje dynamicznie asemblery

[Skopiuj link]
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 MSBuild
Następny:.NET/C# Testowanie wydajności odbicia, emitowania, ekspresji
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com