Чтение онлайн

на главную - закладки

Жанры

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

// Добавляем описание параметров

DefineAddParameters(method);

// Создаем тип

Type t = tb.CreateType;

// Записываем сборку в файл "mylib.dll"

ab.Save("mylib.dll");

return 0;

 }

 // Создает сборку с именем "mylib"

 static AssemblyBuilder DefineNewAssembly {

//
Новая сборка создается в рамках текущего AppDomain-а

AppDomain current = AppDomain.CurrentDomain;

// Новая сборка нуждается в имени. Назначаем ей не строгое имя!

AssemblyName an = new AssemblyName;

an.Name = "mylib";

// DefineDynamicAssembly завершает работу по созданию сборки

return current.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save);

 }

 // Создает новое описание интерфейса с именем "MyLib.ICalculator"

 static TypeBuilder DefineICalculator(AssemblyBuilder ab) {

// Все описания типов находятся в модуле, определенном для нашей сборки

ModuleBuilder mb = ab.DefineDynamicModule("mylib.dll", "mylib.dll");

// Все описания интерфейсов должны быть помечены как Interface и Abstract

TypeAttributes attrs = TypeAttributes.Interface | TypeAttributes.Abstract;

// public-интерфейсы должны быть также помечены как

Public attrs |= TypeAttributes.Public;

// DefineType завершает работу по созданию описания для интерфейса

return mb.DefineType("MyLib.ICalculator", attrs);

 }

 // Создает новое описание методов "double Add(double, ref double, out double)"

 static MethodBuilder DefineAddMethod(TypeBuilder itf) {

// Методы интерфейса должны быть помечены как abstract, virtual и public

MethodAttributes attrs = MethodAttributes.Public | MethodAttributes.Abstract | MethodAttributes.Virtual;

// Метод определяется по имени и описанию (его параметрам)

// Создаем описание возвращаемого значения

Type resultType = typeof(double);

// Создаем описание параметров

Type[] paramTypes = new Type[] {

typeof(double), Type.GetType("System.Boolean&"), Type.GetType("System.Boolean&")

};

// DefineMethod
завершает работу по созданию описания метода

return itf.DefineMethod("Add", attrs, resultType, paramTypes);

 }

 // Задает имя параметров и их последовательность

 static void DefineAddParameters(MethodBuilder method) {

// 1-й и 2-й параметры не нуждаются в специальных атрибутах

method.DefineParameter(1, ParameterAttributes.None, "n");

method.DefineParameter(2, ParameterAttributes.None, "round");

// Параметру 3 нужно задать флаг

Out ParameterBuilder pb = method.DefineParameter(3, ParameterAttributes.Out, "overflow");

// 3-му параметру также необходимо задать атрибут

Interop.Out AddInteropOutAttribute(pb);

 }

 // Задает атрибут Interop.Out для параметра

 static void AddInteropOutAttribute(ParameterBuilder param) {

// Конструкторы идентифицируют пользовательские атрибуты

Type attrtype = typeof(System.Runtime.InteropServices.OutAttribute);

ConstructorInfo outattrctor = attrtype.GetConstructors[0];

// CustomAttributeBuilder сериализует аргументы конструктора

CustomAttributeBuilder outattr = new CustomAttributeBuilder(outattrctor, new object[0]);

// Всю работу выполняет SetCustomAttribute

param.SetCustomAttribute(outattr);

 }

}

Определение типа, сгенерированное этой программой, неотличимо от производимого компилятором C# (Visual Basic, C++, Perl, Python, или любого другого совместимого с CLR).

Метаданные обязательны. В com можно было определить на C++ частные интерфейсы, не описывая их в IDL или библиотеке типов. Это позволяло создать недокументированную лазейку в свой объект. В CLR это сделать не удастся.

В CLR все типы должны быть документированы через информацию о типах, включая private-типы (скрытых типов), не рассчитанные на внешнее использование. Для поддержки скрытых типов компонента метаданные CLR позволяют пометить типы (и их отдельные члены) как доступные только изнутри описываемой сборки. Например, следующий интерфейс виден только из сборки, в которой он определен:

internal interface IBob {

 void hibob;

}

Напротив, следующий интерфейс виден любой сборке:

Поделиться:
Популярные книги

Вперед в прошлое 5

Ратманов Денис
5. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 5

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Идеальный мир для Демонолога 8

Сапфир Олег
8. Демонолог
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Демонолога 8

Первый среди равных. Книга VII

Бор Жорж
7. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга VII

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Доктор. Заново

Афанасьев Семён
1. Доктор
Фантастика:
фэнтези
альтернативная история
5.86
рейтинг книги
Доктор. Заново

Неудержимый. Книга XXIII

Боярский Андрей
23. Неудержимый
Фантастика:
попаданцы
фэнтези
фантастика: прочее
5.00
рейтинг книги
Неудержимый. Книга XXIII

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Адвокат Империи 7

Карелин Сергей Витальевич
7. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 7

Идеальный мир для Лекаря 16

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I