Створення DLL-бібліотеки як окремого рішення (в іншому процесі)
Основна мета створення і використання DLL-бібліотек – забезпечення повторного використання коду. Тому в реальних системах різні компоненти можуть викликати однакові бібліотечні методи. Для цього DLL-бібліотека повинна знаходитися в окремому рішенні.
Для підключення бібліотеки до проекту файл зі збіркою, що містить бібліотеку потрібно підключити з меню «Add Reference». Оскільки проект не включений в Рішення, то у вікні додавання посилань потрібно вказати шлях до проекту у файловій системі.
Теоретичні відомості
Многофайловая сборка - это коллекция взаимосвязанных модулей, которые развертываются в виде цельной логической единицы. В IDE-среде Visual Studio шаблона проекта для создания многофайловой сборки на С# не предусмотрено. Поэтому используется компилятор командной строки (csc.exe).
Задача: создать многофайловую сборку по имени Car. В главном модуле этой сборки (car.dll) должен содержаться единственный тип класса SportCar и соответствующий манифест, который указывает на наличие дополнительного файла *.netmodule по имени auto.netmodule, содержащего еще один класс Auto. Каждый класс должен размещаться в отдельном двоичном файле, а пространство имен у них будет одно — Car. Оба класса создать на С#
Порядок создания многофайловой сборки приведен ниже.
1. С помощью любого простого текстового редактора создадим определение для класса Auto и сохраним его в файле с именем auto.cs:
using System;
namespace Car
{
public class Auto
{
public void AutoInfo()
{
Console.WriteLine("Информация об автомобиле: ");
}
}
}
2. Скомпилируем этот класс в .NET-модуль. Для этого откройте в Visual Studio 2010 окно командной строки, перейдите в папку, где был сохранен файл auto.cs, и введите следующую команду (опция module флага /t указывает, что должен быть создан файл *.netmodule, а не *.dll или *.ехе):
csc.exe /t:module auto.cs
В папке с файлом auto.cs появится новый файл по имени auto.netmodule.
3. Создадим новый файл sportcar.cs со следующим определением класса:
using System;
namespace Car
{
public class SportCar
{
public void InfoSportCar()
{
Console.WriteLine("Audi R8");
}
}
}
4. Скомпилируем sportcar.cs так, чтобы главный модуль в этой многофайловой сборке назывался car.dll. Кроме того, он должен включать информацию о двоичном файле auto.netmodule.
Выбираем соответствующие опции /t: library и /out:.
Чтобы включить информацию о двоичном файле auto.netmodule в манифест сборки, также потребуется добавить соответствующий флаг /addmodule. Полностью необходимая команда выглядит следующим образом:
csc /t:library /addmodule:auto.netmodule /out:car.dll sportcar.cs
После выполнения этой команды в каталоге должен появиться главный модуль car.dll, а также второстепенный двоичный файл auto.netmodule.
5. Анализ манифеста.
5.1. Откроем файл auto.netmodule в утилите c:\program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe (возможно, путь на вашем ПК будет иной). Сразу же можно будет заметить, что в нем содержится манифест уровня модуля, единственной задачей которого является перечисление всех внешних сборок, которые упоминаются в кодовой базе. Поскольку в классе Auto был практически добавлен только вызов Console.WriteLine(), обнаружится следующая ключевая информация:
5.2. Далее откроем в ildasm.exe файл главного модуля car.dll и изучим содержимое манифеста уровня всей сборки. В нем важно обратить внимание, что маркер .file используется для представления информации о других ассоциируемых с многофайловой сборкой модулях (в данном случае — auto.netmodule), а маркеры .class extern — для перечисления имен внешних типов, которые упоминаются как используемые во второстепенном модуле (в данном случае — Auto). Ниже приведена соответствующая информация:
Дата: 2019-02-25, просмотров: 228.