Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 50355|Odpověď: 0

[Zdroj] .NET/C# Emit dynamicky generuje assemblies

[Kopírovat odkaz]
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 MSBuild
Další:.NET/C# Testování výkonu reflexe, emitu, výrazu
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com