Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 138

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ILGenerator являСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Emit(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² совокупности с Ρ‚ΠΈΠΏΠΎΠΌ класса System.Reflection.Emit.OpCodes. Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² этой Π³Π»Π°Π²Π΅, Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ большой Π½Π°Π±ΠΎΡ€ доступных Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΏΠΎΠ»Π΅ΠΉ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΡ…ΡΡ Π² ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ CIL. ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ эти Ρ‡Π»Π΅Π½Ρ‹ описаны Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ доступной систСмС справки, Π½ΠΎ Ρ†Π΅Π»Ρ‹ΠΉ ряд ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π²Ρ‹ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… страницах.

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ динамичСского ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс опрСдСлСния ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° .NET Π² срСдС выполнСния, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим ΠΎΠ΄Π½ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ динамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ с ΠΈΠΌΠ΅Π½Π΅ΠΌ MyAssembly.dll. Π’ этом ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ класс HelloWorld. Π’ΠΈΠΏ HelloWorld ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ конструктор, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ конструктор для присваивания значСния ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (theMessage) Ρ‚ΠΈΠΏΠ° string. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, HelloWorld ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра с ΠΈΠΌΠ΅Π½Π΅ΠΌ SayHello(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ привСтствиС Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра, GetMsg(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΡƒΡŽ строку. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ класса.

// Π­Ρ‚ΠΎΡ‚ класс Π±ΡƒΠ΄Π΅Ρ‚ создан Π² срСдС выполнСния

// с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ System.Reflection.Emit.

public class HelloWorld {

 private string theMessage;

 HelloWorld() {}

 HelloWorld(string s) { theMessage = s; }

 public string GetMsg() { return theMessage; }

 public void SayHello() {

  System.Console.WriteLine("ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΎΡ‚ класса HelloWorld!");

 }

}

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ cΠΎΠ·Π΄Π°Π»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ консольного прилоТСния Π² Visual Studio 2005, Π½Π°Π·Π²Π°Π² Π΅Π³ΠΎ DynAsmBuilder. ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠΉΡ‚Π΅ исходный класс Π² MyAsmBuilder ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΈΠΌΠ΅Π½Π΅ΠΌ CreateMyAsm(). Π­Ρ‚ΠΎΡ‚ СдинствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ отвСтствСнСн Π·Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

β€’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ характСристик динамичСского ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° (имя, вСрсия ΠΈ Ρ‚.Π΄.);

β€’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠ½Π° HelloClass;

β€’ запись ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, сгСнСрированного Π² памяти, Π² физичСский Ρ„Π°ΠΉΠ».

Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ CreateMyAsm() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π² качСствС СдинствСнного ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏ System.AppDomain, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для получСния доступа ΠΊ Ρ‚ΠΈΠΏΡƒ AssemblyBuilder, связанному с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ прилоТСния (см. Π³Π»Π°Π²Ρƒ 13, Π³Π΄Π΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π΄ΠΎΠΌΠ΅Π½Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ .NET). Π’ΠΎΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ.

// Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона посылаСт Ρ‚ΠΈΠΏ AppDomain.

public static void CreateMyAsm(AppDomain currAppDomain) {

 // Установка ΠΎΠ±Ρ‰ΠΈΡ… характСристик ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.

 AssemblyName assemblyName = new AssemblyName();

 assemblyName.Name = "MyAssembly";

 assemblyName.Version = new Version("1.0.0.0");

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°

 // Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° прилоТСния.

 AssemblyBuilder assembly = curAppDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);

 // ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ создаСтся ΠΎΠ΄Π½ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ,

 // имя модуля Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.

 ModuleBuilder module = assembly.DefineDynamicModule("MyAssembly", "MyAssemblΡƒ.dll");

 // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ класса с ΠΈΠΌΠ΅Π½Π΅ΠΌ "HelloWorld".

 TypeBuilder helloWorldClass = module.DefineType("MyAssembly.HelloWorld", TypeAttributes.Public);

 // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ String с ΠΈΠΌΠ΅Π½Π΅ΠΌ "theMessage".

 FieldBuilder msgField = helloWorldClass.DefineField("theMessage", Type.GetType("System.String"), FieldAttributes.Private);

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ конструктора.

 Type[] constructorArgs = new Type[1];

 constructorArgs[0] = typeof(string);

 ConstructorBuilder constructor = helloWorldClass.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, constructorArgs);

 ILGenerator constructorIL = constructor.GetILGenerator();

 constructorIL.Emit(OpCodes.Ldarg_0);

 Type objectClass = typeof(object);

 ConstructorInfo superConstructor = objectClass.GetConstructor(new Type[0]);

 constructorIL.Emit(OpCodes.Call, superConstructor);

 constructorIL.Emit(Opcodes.Ldarg_0);

 constructorIL.Emit(Opcodes.Ldarg_1);

 constructorIL.Emit(OpCodes.Stfld, msgField);

 constructorIL.Emit(OpCodes.Ret);

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ конструктора, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

 helloWorldClass.DefineDefaultConstructor(MethodAttributes.Public);

 // Π’Π΅ΠΏΠ΅Ρ€ΡŒ созданиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° GetMsg().

 MethodBuilder getMsgMethod = helloWorldClass.DefineMethod("GetMsg", MethodAttributes.Public, typeof(string), null);

 ILGenerator methodIL = getMsgMethod.GetILGenerator();

 methodIL.Emit(OpCodes.Ldarg_0);

 methodIL.Emit(OpCodes.Ldfld, msgField);

 methodIL.Emit(Opcodes.Ret);

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° SayHello.

 MethodBuilder sayHiMethod = helloWorldClass.DefineMethod("SayHello", MethodAttributes.Public, null, null);

 methodIL = sayHiMethod.GetILGenerator();

 methodIL.EmitWriteLine("ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΎΡ‚ класса HelloWorld!");

 methodIL.Emit(Opcodes.Ret);

 // Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ класса HelloWorld.

 helloWorldClass.CreateType();

 // (ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.) Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² Ρ„Π°ΠΉΠ».

 assembly.Save("MyAssembly.dll");

}

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΈ Π½Π°Π±ΠΎΡ€Π° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

ΠœΠ΅Ρ‚ΠΎΠ΄ начинаСтся с указания минимального Π½Π°Π±ΠΎΡ€Π° характСристик ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, для Ρ‡Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΡ‹ AssemblyName ΠΈ Version (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² пространствС ΠΈΠΌΠ΅Π½ System.Reflection). Π—Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° уровня экзСмпляра AppDomain.DΠ΅fineDynamicAssembly() Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ‚ΠΈΠΏ AssemblyBuilder (Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона пСрСдаст Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ CreateMyAsm() ссылку Π½Π° AppDomain).

// Установка ΠΎΠ±Ρ‰ΠΈΡ… характСристик ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°

// ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ Ρ‚ΠΈΠΏΡƒ AssemblyBuilder.

public static void CreateMyAsm(AppDomain currAppDomain) {

 AssemblyName assemblyName = new AssemblyName();

 assemblyName.Name = "MyAssembly";

 assemblyName.Version = new Version("1.0.0.0");

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ AppDomain.

 AssemblyBuilder assembly = currAppDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);

 β€¦

}

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ AppDomain.DefineDynamicAssembly() Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ доступа ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΡƒ. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π». 15.10.

Π’Π°Π±Π»ΠΈΡ†Π° 15.10. ЗначСния пСрСчня AssemblyBuilderAccess 

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ОписаниС ReflectionOnly ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Run ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² памяти, Π½ΠΎ Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π½Π° диск RunAndSave ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² памяти ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π½Π° диск Save ДинамичСский ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π½Π° диск, Π½ΠΎ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² памяти

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π° ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ для Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ являСтся ΠΎΠ΄Π½ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Если с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° DefineDynamicModule() трСбуСтся ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ имя Π΄Π°Π½Π½ΠΎΠ³ΠΎ модуля (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, myMod.dotnetmodule). Однако ΠΏΡ€ΠΈ создании ΠΎΠ΄Π½ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° имя модуля Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ ΠΈΠΌΠ΅Π½ΠΈ самого ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅, послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° DefineDynamicModule() Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ссылку Π½Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ModuleBuilder.

// ΠžΠ΄Π½ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

ModuleBuilder module = assembly .DefineDynamicModule("MyAssembly", "MyAssembly.dll");

Роль Ρ‚ΠΈΠΏΠ° ModuleBuilder

Π’ΠΈΠΏ ModuleBuilder являСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ для процСсса построСния динамичСских ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ². Π’ соотвСтствии с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ оТиданиями, ModuleBuilder ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ†Π΅Π»Ρ‹ΠΉ ряд Ρ‡Π»Π΅Π½ΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ мноТСство Ρ‚ΠΈΠΏΠΎΠ², содСрТащихся Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ (классы, интСрфСйсы, структуры ΠΈ Ρ‚.Π΄.), Π° Ρ‚Π°ΠΊΠΆΠ΅ мноТСство встроСнных рСсурсов (Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ строк, изобраТСния ΠΈ Ρ‚.Π΄.; Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ рСсурсов .NET Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн Π² Π³Π»Π°Π²Π΅ 20). НСкоторыС ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², относящихся ΠΊ созданию инфраструктуры модуля, описаны Π² Ρ‚Π°Π±Π». 15.11 (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π»ΠΈΡΡŒ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ).

Π’Π°Π±Π»ΠΈΡ†Π° 15.11. ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠ° Ρ‡Π»Π΅Π½ΠΎΠ² Ρ‚ΠΈΠΏΠ° ModuleBuilder

ΠœΠ΅Ρ‚ΠΎΠ΄ ОписаниС DefineEnum() Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для гСнСрирования опрСдСлСния пСрСчня .NET DefineResource() ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ управляСмый встроСнный рСсурс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ DefineType() ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΠ΅Ρ‚ TypeBuilder, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, интСрфСйсы ΠΈ Ρ‚ΠΈΠΏΡ‹ класса (Π² Ρ‚ΠΎΠΌ числС ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹)

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ Ρ‡Π»Π΅Π½ΠΎΠΌ класса ModuleBuilder, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ слСдуСт Π·Π½Π°Ρ‚ΡŒ, являСтся DefineType(). Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΈΡŽ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΈΠΏΠ° (Π² Π²ΠΈΠ΄Π΅ простой строки), Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ System.Reflection.TypeAttributes, Ρ‡Ρ‚ΠΎΠ±Ρ‹ нСпосрСдствСнно ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ‚ΠΈΠΏΠ°. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ пСрСчня TypeAttributes прСдставлСны Π² Ρ‚Π°Π±Π». 15.12.