Создание сборки и класса
Вначале мы создаем сборку, в которой будет находиться модуль, содержащий наш класс:
AppDomain ad = System.Threading.Thread.GetDomain(); AssemblyName an = new AssemblyName(); an.Name=System.IO.Path.GetFileNameWithoutExtension("numbers.exe"); AssemblyBuilder ab = ad.DefineDynamicAssembly (an, AssemblyBuilderAccess.RunAndSave); ModuleBuilder modb = ab.DefineDynamicModule ("numbers.exe", "numbers.exe"); modb.CreateGlobalFunctions();TypeBuilder classb = modb.DefineType ("Sample"); MethodBuilder mb = classb.DefineMethod ("Run", MethodAttributes.Public|MethodAttributes.Static, typeof (void), null);
Вначале необходимо создать домен приложения, в котором мы будем создавать класс:
AppDomain ad = System.Threading.Thread.GetDomain();
Далее мы создаем имя сборки:
AssemblyName an = new AssemblyName(); an.Name = System.IO.Path.GetFileNameWithoutExtension ("numbers.exe");
Теперь создаем класс, генерирующий сборку, и используем его для создания модуля, который будет содержать наш класс (отметим, что атрибут RunAndSave означает, что данная сборка может быть исполнена или сохранена на диске):
AssemblyBuilder ab = ad.DefineDynamicAssembly (an, AssemblyBuilderAccess.RunAndSave); ModuleBuilder modb = ab.DefineDynamicModule ("numbers.exe", "numbers.exe"); modb.CreateGlobalFunctions ();
Далее мы создаем билдер класса Sample и создаем в этом классе метод Run. Первый параметр DefineMethod задает имя метода, второй - атрибуты метода (в нашем случае - public и static), затем задается тип результата метода и массив типов параметров (если параметры у метода отсутствуют, как в нашем примере, то можно передать пустой указатель).
TypeBuilder classb = modb.DefineType ("LowLevelSample"); MethodBuilder mb = classb.DefineMethod ("Run", MethodAttributes.Public|MethodAttributes.Static, typeof (void), null);