Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 137

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 131 132 133 134 135 136 < 137 > 138 139 140 141 142 143 .. 320 >> Следующая

Для создания в процессе выполнения отдельного модуля внутри сборки
Дли создания типа (перечисления, класса, интерфейса и т. п.) в модуле в процессе выполнения
Эти и аналогичные типы нужны для создания внутренних членов создаваемых типов (методов, локальных переменных, свойств, конструкторов, атрибутов и т. п.) в процессе выполнения
Используется для создания кода промежуточного языка (IL.) для члена _типа в процессе выполнения
Создаем динамическую сборку
Если вы планируете создавать «налечу» более-менее сложные сборки, вам потребуется очень хорошо знать особенности кода IL. В этой книги мы не будем подробно рассматривать код IL, однако простейшую динамическую сборку мы все же создадим - чтобы показать, как это делается. Если вам потребуется подробная информация по коду IL, мы советуем обратиться к официальной документации в разделе Tool Developers Guide (Руководство для создателей средств разработки) в .NET SDK.
В этом разделе мы создадим простую динамическую сборку. Эта сборка будет однофайловой — то есть она будет состоять из единственного модуля, который будет называться так же, как и сама сборка. В самой сборке будет определен класс
Применение динамических сборок 329
с очень редким именем — He 1 і сіло і" 1с. В этом классе будет предусмотрен пользовательский конструктор, принимающий в качестве параметра строковое значение и присваивающий это значение переменной Msg, Кроме того, в нашем классе будет два метода. Первый, SayHe 11 о(), выводит стандартное приветствие, авторой, Get Msg С), возвращает значение переменной Мед. В общем, класс, который мы должны создавать «налету* из другой программы, в итоге должен получиться таким:
// Этот класс будет создан во время выполнения при помощи типов из пространства имен System.Ref1ecti on.Emi t public class HelloWorld I
private string Msg;
Il Конструктор и открытые методы класса HelloWorldCstnng s) ( Msg = s: } public string GetMsgO { return Msg; }
public void SayHelloO { System-Console.WriteLinefHello there");
}
Гопсрь наша задача — создать другой класс, который позволит создавать HeI 1 oteo г 1 d «на лету». Начнем с создания нового проекта типа С. mi sole Application и назовем этот проект DyпАьт Builder. В этом проекте создадим новый класс (пусть он называется i"-iyAs .TiEk i 1о/-;; с единственным методом — OeatsMyAsriiпри запуске мггороїо должны происходить создание динамической сборки с классом •.• . " ,1 « запис ь
ее на диск. Вот полный код этого метода (анализ будет приведен ниже):
// Вызывающий этот метод долшен передать єну объект типа AppDomain public int CreateMyAsm(AppDomain curAppDomain)
{
// Определяем иия и версию создаваемой сборки AssemhlyName assemblyName = new AssemblyNameO: assemblyName.Name = "MyAssenibly"; assemblyName.Version = new Vers1on("l.0.0.0"):
И Создаен сборку в памяти
AssemblyBuilder assembly = curAppDomain.UefineDynamicAssembly(assemblyUame.
AssemblyBuilderAccess. Save);
// Создаем однофайловущ сборку, в которой иия единственного модуля совпадает Ii с именем самой сборки
Modul eBciildei module = assembly.DefineDynamicModuleCMyAssembly".
"MyAssembly.dll");
II Создаем и определяем как public класс HelloWorld
TypeBuilder helloWorldClass = module.DefineTypeC'MyAssembly. HelloWorld",
TypeAttri butes.Public):
I/ Определяем переменную Msg (должно получиться private string Msg) FieldBuilder msgField = helloWorldClass.DegineFieldC'Msg".
Type.GetTypeC"System.String"). FieldAttriDutes.Private):
II Определяем конструктор (как НеїloWorldtstring s)) Type[] costructorArgs = new Туре[1]: constructorArgs[0] = type.GetType( "System,String")-, ConstructorBuilder constructor = helloWorldClass,DefineConstructor
(MethodAttributes,Public, CaI1 іngConventions.Standard. constructorArgs):
ILGenerator constructor!!. = constructor¦.GecJLUer.erato-f):
330 Глава 7 • Рефлексия типов и программирование с использованием атрибутов
constгuctorIL.Effli t(Opcodes.Lda rg_0);
Type objectClass = Type.GetTypeCSystem.Object"):
Constructorlnfo superConstructor = objectCl.iss.GetCorstructortnew Type[D]):
constructQrIL.Emit(OpCodes.Call, superConstructor);
constructor IL. Emit(OpCodes .LdargJ!:
constructorIL.?mit(OpCodes.Ldarg_l);
constructorIL. Emit (Opcodes. Stf 1 d. msgField)
constructorIL.EmIt(0pCodes. Ret):
// А теперь создаем нетод GetMsgO (должно получиться public string GetMsgO)
MethodBuilder getMsgMethod = helloWorldClas.;.DefineMethod("GetMsg".
MethodAttrі butes.Publі с. Type.GetType("System.String"). null):
ILGenerator methodIL = getMsgMethod.GetILGenerator(); met hodIL.Emi t(Opcodes.Lda rg_0); method IL. Emi UOpCodes.Ldf Id. msgField); met hodIL.Emi t(OpCodes. Ret):
Создаен нетод SayHelloC) (должно получился public void SayHelloO MethodBuilder sayHiMethod - helloWorldClass DefineMethodC'SayHello".
MethodAttnbutes.Public, null, null);'
methodIL - sayHiMethod.GetILGenerator(): methodIL.Emi tWriteLine("Неї 1 о there!"): methodIL.Em і t(OpCodes. Ret):
II Да будет класс HelloWorldl helloWorldClass.CreateType():
II Осталось только сохранить сборку на диск assembly.Save("MyAssembly.dl 1"): return 0;
Предыдущая << 1 .. 131 132 133 134 135 136 < 137 > 138 139 140 141 142 143 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100