Исследование однофайловых сборок

27

Исследование манифеста

Прежде чем переходить к использованию библиотеки в клиентском приложении, давайте сначала посмотрим, как она устроена изнутри. Для этого скомпилируем и загрузим проект из предыдущей статьи в утилиту ildasm.ехе:

Проект загруженный в утилиту ildasm.exe

Теперь давайте отобразим манифест сборки, дважды щелкнув на элементе MANIFEST. В первом блоке любого манифеста всегда перечисляются все внешние сборки, которые требуются текущей сборке для нормального функционирования. Вспомните, что в сборке Class1.dll используются типы из внешних сборок mscorlib.dll и System.Windows.Forms.dll, поэтому обе они и будут отображаться в манифесте под маркерами .assembly extern:

Манифест сборки

Здесь каждый блок .assembly extern сопровождается уточняющими директивами .publickeytoken и .ver. Инструкция .publickeytoken появляется только в том случае, если сборка была сконфигурирована со строгим именем. Маркер .ver отражает числовой идентификатор версии упоминаемой сборки. После ссылок на внешние сборки идет набор маркеров .custom, в которых перечислены атрибуты сборки (информация об авторском праве, название компании, версия сборки и т.д.).

Обычно эти параметры устанавливаются визуальным образом в редакторе свойств текущего проекта. Вернитесь в Visual Studio 2010, дважды щелкните на значке Properties (Свойства) в окне Solution Explorer, и затем щелкните на кнопке Assembly Information (Сведения о сборке) на вкладке Application (Приложение), которая открывается по умолчанию. Откроется диалоговое окно Assembly Information (Информация о сборке), показанное на рисунке:

Редактирование информации о сборке

При сохранении изменений это диалоговое окно обновляет соответствующим образом файл AssemblyInfo.cs, который поддерживается Visual Studio 2010 и может просматриваться за счет разворачивания в окне Solution Explorer узла Properties (Свойства).

Создание клиентского приложения на C#

Поскольку все типы в ShopAuto были объявлены с ключевым словом public, они могут использоваться также и в других сборках. Вспомните, что типы могут объявляться и с таким поддерживаемым в C# ключевым словом, как internal (которое применяется в C# в качестве модификатора доступа по умолчанию). Типы, объявляемые как internal, могут использоваться только в сборке, где находится их определение. Внешние клиенты не могут ни видеть, ни создавать типы, помеченные ключевым словом internal.

В .NET поддерживается возможность определения так называемых "дружественных сборок", которые позволяют внутренним типам использоваться в указанном наборе сборок. Более подробную информацию об этом можно найти в документации .NET Framework 4.0 SDK, в разделе, посвященном описанию класса InternalsVisibleToAttribute. Однако следует иметь в виду, что прием с созданием дружественных сборок применяется довольно редко.

Чтобы использовать типы из библиотеки ShopAuto, создадим новый проект типа Console Application на C# по имени CSharpCarClient. Добавим в него ссылку на Class1.dll на вкладке Browse диалогового окна Add Reference (если сборка Class1.dll компилировалась в Visual Studio, она будет находиться в подкаталоге \Bin\Debug внутри папки проекта). После этого можно приступать к созданию клиентского приложения, предусматривающего использование внешних типов. Модифицируем исходный файл кода на C#, как показано ниже:

using System;
using ShopAuto;

namespace CSharpCarClient
{
    public class MyProgram
    {
        static void Main()
        {
            HatchBack auto1 = new HatchBack("VAZ2109", 160, 80000, 2.5);
            auto1.Inf();

            Console.ReadLine();
        }
    }
}

Этот код выглядит точно так же, как и код других разрабатывавшихся ранее приложений. Единственным представляющим интерес моментом в нем является то, что в клиентском приложении на C# теперь используются типы, определенные внутри отдельной специальной сборки. Давайте попробуем запустить это приложение. Как и следовало ожидать, его выполнение приведет к отображению окна с сообщением о машине.

Лучший чат для C# программистов