|
|
Zveřejněno 2021-3-21 12:38:34
|
|
|
|

Aplikační scénáře v našem C# kódu dynamicky generují EXE, jeho aplikační scénáře mohou být velmi rozmanité, například autorizace softwaru, můžete zadat autorizační informace, generovat autorizované DLL atd., takže jak tuto funkci dosáhnout, musíme zmínit technický Emit.
1. Přehled Emit
Emit, může být nazýván emitující nebo generující. Ve Frameworku existují třídy související s Emitem v podstatě pod jmenným prostorem System.Reflection.Emit. Lze vidět, že Emit existuje jako prvek reflexe. Když už mluvíme o reflexi, každý by ji měl znát, umožňuje nám vidět prvky assembleru, abychom získali velké množství informací, například jaké typy assembler obsahuje, jaké metody typ obsahuje a podobně. Ale odrazy lze pouze 'vidět', zatímco Emit může dynamicky generovat kód za běhu. Podívejme se, jak generovat kód pomocí Emitu.
2. Sestavení a řízený modul
Assembler je logická skupina jednoho nebo více modulů, resource souborů a sekundárně assembler je nejmenší jednotkou pro opětovné použití, zabezpečení a verzování. DLL a EXE, které vidíme, lze nazvat assembler, assembly obsahuje více modulů, ale obvykle, když VS kompilujeme, kompilujeme pouze jeden modul, pokud chceme kompilovat více modulů v assembleru, musíme použít csc.exe implementaci.
3. Dynamicky generovat operace s kódem
Nejprve musíme pochopit, jakým typem je každý dynamický typ v .NET reprezentován.
Assembler: System.Reflection.Emit.AssemblyBuilder (definuje a reprezentuje dynamické assemblery)
Konstruktor: System.Reflection.Emit.ConstructorBuilder (konstruktor, který definuje a reprezentuje dynamické třídy)
Vlastní atribut: System.Reflection.Emit.CustomAttributeBuilder (pomáhá generovat vlastní atributy pomocí parametrů předaných konstruktorem pro generování atributů pro třídy)
Enum: System.Reflection.Emit.EnumBuilder (vysvětluje a označuje typ enumu)
Událost: System.Reflection.Emit.EventBuilder (událost, která definuje třídu)
Pole: System.Reflection.Emit.FieldBuilder (Definuje a reprezentuje pole.) takovou třídu nemohou zdědit)
Lokální proměnné: System.Reflection.Emit.LocalBuilder (reprezentuje lokální proměnné v rámci metody nebo konstruktoru)
Metoda: System.Reflection.Emit.MethodBuilder (metoda (nebo konstruktor), který definuje a reprezentuje dynamickou třídu)
Modul: System.Reflection.Emit.ModuleBuilder (definuje a reprezentuje moduly v dynamických assemblech)
Parametr: System.Reflection.Emit.ParameterBuilder (vytvořit nebo přiřadit informace o parametrech, jako jsou parametry metody, parametry událostí atd.)
Vlastnost: System.Reflection.Emit.PropertyBuilder (Definujte typ vlastnosti)
Třída: System.Reflection.Emit.TypeBuilder (definovat a vytvořit novou instanci třídy za běhu)
OpCode je popis směrnice pro mezijazyk (IL). Existuje spousta návodů, můžete se podívat na oficiální web Microsoftu:Přihlášení k hypertextovému odkazu je viditelné.
Omezení přístupu AssemblyBuilder Access
AssemblyBuilderAccess.Run; Označuje, že sestavení lze spustit, ale nelze uložit. AssemblyBuilderAccess.Save; Naznačuje, že sestavení lze uložit, ale ne provést. AssemblyBuilderAccess.RunAndSave; Označuje, že assembler lze uložit a spustit. AssemblyBuilderAccess.ReflectionOnly; Naznačuje, že sestavy lze použít pouze v reflexivním kontextu a nelze je vykonávat. AssemblyBuilderAccess.RunAndCollect; Označuje, že sestavu lze odtěžit a paměť získat zpět.
Kód je následující:
Nejprve použijte emit k generování IL kódu, poté dynamicky vygenerujte assembler a nakonec načtěte assembler a zavolejte jeho metody, jak je znázorněno na obrázku níže:
Použijte ILSpy pro zobrazení generovaného kódu, jak je znázorněno na obrázku níže:
(Konec)
|
Předchozí:Rozdíl mezi kompilátorem Roslyn MSBuildDalší:.NET/C# Testování výkonu reflexe, emitu, výrazu
|