Разработка компиляторов

       

Создание сборки и класса


Создание сборки и класса

Вначале мы создаем сборку, в которой будет находиться модуль, содержащий наш класс:

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);



Содержание раздела