Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 50355|Válasz: 0

[Forrás] .NET/C# Dinamikusan generál összeállításokat

[Linket másol]
Közzétéve: 2021-3-21 12:38:34 | | | |
Az alkalmazási szcenáriók C# kódunk alapján dinamikusan generálnak egy EXE-t, az alkalmazási forgatókönyvek nagyon sokan lehetnek, például szoftver engedélyezés, beírhatod az engedélyezési adatokat, létrehozhatsz egy engedélyezett DLL-t stb., tehát ennek elérésének érdekében meg kell említenünk egy technikai kibocsátást.

1. Az Emit áttekintése

Az emitációt nevezhetjük kibocsátásnak vagy generálónak. A Frameworkben az Emithez kapcsolódó osztályok lényegében a System.Reflection.Emit névtér alatt léteznek. Látható, hogy az Emit a reflexió elemeként létezik. Ha már a reflexiónál tartunk, mindenkinek ismernie kell, hogy megtekintsük az összeállítás elemeit, így nagy mennyiségű információt kaphatunk, például hogy milyen típusokat tartalmaz az összeállítás, milyen módszereket tartalmaz a típus, és így tovább. De a visszatükröződések csak 'láthatók', míg az Emit dinamikusan képes kódot generálni futáskor. Nézzük meg, hogyan lehet kódot generálni az Emit-tel.

2. Összeszerelés és menedzselt modul

Az assembly egy vagy több modul, erőforrás fájl logikai csoportosítása, másodlagosan pedig az assembly a legkisebb újrahasználati, biztonsági és verziókezelési egység. A látott DLL-eket és EXE-ket nevezhetjük assemblynek, egy assembly több modult tartalmaz, de általában, amikor VS kompetálunk, csak egy modult fordítunk le, ha több modult akarunk fordítani egy összeállításban, akkor csc.exe implementációt kell használnunk.

3. Dinamikusan generálni a kódműveleteket

Először is meg kell értenünk, hogy melyik dinamikus típus milyen típus képviseli az .NET-ben.

Assembly: System.Reflection.Emit.AssemblyBuilder (dinamikus összeállításokat definiál és reprezentál)

Constructor: System.Reflection.Emit.ConstructorBuilder (egy olyan konstruktor, amely dinamikus osztályokat definiál és reprezentál)

Egyedi attribútum: System.Reflection.Emit.CustomAttributeBuilder (segít egyedi attribútumokat generálni a konstruktor által átadott paraméterek segítségével, hogy osztályok attribútumokat generáljanak)

Enum: System.Reflection.Emit.EnumBuilder (magyarázza és jelzi az enum típust)

Esemény: System.Reflection.Emit.EventBuilder (az osztályt definiáló esemény)

Mező: System.Reflection.Emit.FieldBuilder (Definiálja és reprezentálja a mezőket.) nem örökölhet ilyen osztályt)

Helyi változók: System.Reflection.Emit.LocalBuilder (helyi változókat képvisel egy metóduson vagy konstruktorban)

Módszer: System.Reflection.Emit.MethodBuilder (egy metódus (vagy konstruktor), amely egy dinamikus osztályt definiál és reprezentál)

Modul: System.Reflection.Emit.ModuleBuilder (dinamikus összeszerelésekben definiálja és reprezentálja a modulokat)

Parameter: System.Reflection.Emit.ParameterBuilder (létrehozz vagy társíts paraméterinformációkat, például metódusparamétereket, eseményparamétereket stb.)

Property: System.Reflection.Emit.PropertyBuilder (Határozd meg az ingatlan típusát)

Osztály: System.Reflection.Emit.TypeBuilder (definiáld és hozz létre egy új példányt az osztályból futásidőben)

Az OpCode egy köztes nyelvi (IL) irányelv leírása. Erre rengeteg utasítás van, megnézheted a hivatalos Microsoft weboldalt:A hiperlink bejelentkezés látható.

AssemblyBuilderAccess hozzáférési korlátozások

AssemblyBuilderAccess.Run; Jelzi, hogy az összeszerelés végrehajtható, de nem menthető el.
AssemblyBuilderAccess.Save; Jelzi, hogy az összeszerelés menthető, de nem hajtható végre.
AssemblyBuilderAccess.RunAndSave; Jelzi, hogy az összeszerelés menthető és végrehajtható.
AssemblyBuilderAccess.ReflectionOnly; Azt jelzi, hogy az összeállításokat csak reflektív kontextusban lehet használni, és nem hajtható végre.
AssemblyBuilderAccess.RunAndCollect; Jelzi, hogy a szerkezet kirakható és visszanyerhető a memória.

A kódex a következő:

Először az emit segítségével generáljuk az IL kódot, majd dinamikusan generálunk egy assembly rendszert, végül pedig töltsük be az összeállítást és hívjuk meg a módszereit, ahogy az alábbi ábrán látható:



Használja az ILSpy-t a generált kód megtekintéséhez, ahogy az alábbi képen látható:



(Vége)





Előző:A különbség a Roslyn MSBuild fordító között
Következő:.NET/C# Reflektív, Emit, Expresszív teljesítménytesztelés
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com