Lietojumprogrammu scenāriji, izmantojot mūsu C# kodu, dinamiski ģenerē EXE, tā lietojumprogrammu scenāriji var būt ļoti daudz, piemēram, programmatūras autorizācija, jūs varat ievadīt autorizācijas informāciju, ģenerēt autorizētu DLL utt., Tātad, kā sasniegt šo funkciju, mums ir jāpiemin tehniskais Emit.
1. Pārskats par emisiju
Izstaro, var saukt par emitējošu vai ģenerējošu. Ietvarā klases, kas saistītas ar Emit, būtībā pastāv System.Reflection.Emit nosaukumtelpā. Var redzēt, ka Emit pastāv kā pārdomu elements. Runājot par pārdomām, ikvienam tas ir jāzina, tas ļauj mums apskatīt montāžas elementus, lai iegūtu lielu informācijas daudzumu, piemēram, kādus veidus satur montāža, kādas metodes satur tips utt. Bet atspulgus var tikai "redzēt", savukārt Emit var dinamiski ģenerēt kodu izpildlaikā. Apskatīsim, kā ģenerēt kodu ar Emit.
2. Montāža un pārvaldītais modulis
Montāža ir viena vai vairāku moduļu, resursu failu loģiska grupa, un sekundāri montāža ir mazākā atkārtotas izmantošanas, drošības un versiju izveides vienība. DLL un EXE, ko mēs redzam, var saukt par montāžu, montāža satur vairākus moduļus, bet parasti, kad mēs VS kompilējam, mēs kompilēsim tikai vienu moduli, ja mēs vēlamies apkopot vairākus moduļus montāžā, mums ir jāizmanto csc.exe ieviešana.
3. Dinamiski ģenerējiet koda operācijas
Pirmkārt, mums ir jāsaprot, kāda veida katrs dinamiskais tips ir attēlots .NET.
Montāža: System.Reflection.Emit.AssemblyBuilder (definē un attēlo dinamiskos komplektus)
Konstruktors: System.Reflection.Emit.ConstructorBuilder (konstruktors, kas definē un attēlo dinamiskās klases)
Pielāgots atribūts: System.Reflection.Emit.CustomAttributeBuilder (palīdz ģenerēt pielāgotus atribūtus, izmantojot konstruktora nodotos parametrus, lai ģenerētu atribūtus klasēm)
Enum: System.Reflection.Emit.EnumBuilder (izskaidro un norāda uzskaitījuma tipu)
Notikums: System.Reflection.Emit.EventBuilder (notikums, kas definē klasi)
Lauks: System.Reflection.Emit.FieldBuilder (definē un attēlo laukus.) nevar mantot šādu šķiru)
Lokālie mainīgie: System.Reflection.Emit.LocalBuilder (attēlo lokālos mainīgos metodē vai konstruktorā)
Metode: System.Reflection.Emit.MethodBuilder (metode (vai konstruktors), kas definē un attēlo dinamisko klasi)
Modulis: System.Reflection.Emit.ModuleBuilder (definē un attēlo moduļus dinamiskos mezglos)
Parametrs: System.Reflection.Emit.ParameterBuilder (izveidojiet vai saistiet parametru informāciju, piemēram, metodes parametrus, notikumu parametrus utt.)
Rekvizīts: System.Reflection.Emit.PropertyBuilder (rekvizīta tipa definēšana)
Klase: System.Reflection.Emit.TypeBuilder (definējiet un izveidojiet jaunu klases instanci izpildlaikā)
OpCode ir starpposma valodas (IL) direktīvas apraksts. Tam ir daudz norādījumu, varat pārbaudīt oficiālo Microsoft vietni:Hipersaites pieteikšanās ir redzama.
AssemblyBuilderAccess piekļuves ierobežojumi
AssemblyBuilderAccess.Run; Norāda, ka montāžu var izpildīt, bet ne saglabāt. AssemblyBuilderAccess.Save; Norāda, ka montāžu var saglabāt, bet ne izpildīt. AssemblyBuilderAccess.RunAndSave; Norāda, ka montāžu var saglabāt un izpildīt. AssemblyBuilderAccess.ReflectionOnly; Norāda, ka komplektus var izmantot tikai atstarojošā kontekstā un tos nevar izpildīt. AssemblyBuilderAccess.RunAndCollect; Norāda, ka montāžu var izlādēt un atmiņu atgūt.
Kods ir šāds:
Pirmkārt, izmantojiet emit, lai ģenerētu IL kodu, pēc tam dinamiski ģenerējiet montāžu un, visbeidzot, ielādējiet montāžu un izsauciet tās metodes, kā parādīts zemāk redzamajā attēlā:
Izmantojiet ILSpy, lai skatītu ģenerēto kodu, kā parādīts zemāk redzamajā attēlā:
(Beigas)
|