Опубликован: 11.09.2006 | Доступ: свободный | Студентов: 7648 / 473 | Оценка: 4.26 / 3.45 | Длительность: 30:46:00
ISBN: 978-5-9556-0080-2
Лекция 9:

Создание пакетов установки

Аннотация: Сборки. Утилита ildasm.exe. Частные сборки. Сборки со строгим именем. Защита сборок. Утилита ilasm.exe. Утилита .NET Reflector. Вскрытие защищенных сборок. Глобальный кэш сборок GAC (Global Assembly Cache). Утилита gacutil.exe. Настройка политики выполнения сборок и контроля версий. Управление политиками сборок. Файлы конфигурации приложения. Создание пакетов установки с библиотекой .NET Framework и без нее. Изменение каталога установки. Добавление ключей реестра на компьютер пользователя. Добавление публичных сборок в GAC. Библиотеки для работы приложения — MDAC, Jet и Crystal Reports. Изменение пользовательского интерфейса установочного пакета. Использование данных, получаемых при установке. Создание автозагрузочного диска

Для работы с данной лекцией используйте примеры.

Для установки на компьютер большинства программ достаточно просто вставить компакт диск с программой в дисковод и, следуя несложным инструкциям, скопировать ее на жесткий диск. В результате мы получаем возможность запускать программу одним из нескольких способов — щелкая на ярлыке на Рабочем столе, выбирая ее группу в меню Пуск или просто дважды щелкая на файле, расширение которого связано с этой программой. Мы не задумываемся, из каких частей состоит программа, как они взаимодействуют, а некоторые пользователи даже не представляют, где эти части находятся. В этой лекции мы научимся создавать дистрибутивы, или пакеты установки, предоставляющие возможность распространять программы с минимумом усилий со стороны конечного пользователя.

Сборки. Утилита ildasm.exe

Приложение всегда состоит из одной или более сборок. Сборка — это функциональная единица, имеющая версию и описание, которую можно использовать в других приложениях. Для каждой сборки можно прописывать отдельные разрешения (подробнее о разрешениях см. "Безопасность Windows-форм" ).

В самом простом случае, сборка — это приложение, которое состоит из одного функционального модуля — класса. В большинстве случаев в приложении может быть несколько сборок, и каждая может иметь свои вспомогательные файлы. При выполнении все сборки приложения должны существовать и к ним должен быть открыт доступ. Каждая сборка должна быть независимой. У любой сборки есть метаданные, которые описывают сборку и содержат версию.

Содержимое сборки можно просмотреть, запустив дизассемблер "Microsoft Intermediate Language Disassembler" (ildasm.exe). Рассмотрим следующий пример — создадим простое консольное приложение, которое выводит на экран строку Hello World:

using System;

namespace SimpleApp
{
    class Class1
    {
      [STAThread]
      static void Main(string[] args)
      {
        Console.WriteLine("Hello World");
      }
    }
}

Утилиту ildasm.exe можно запустить двумя способами — перейти по адресу C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin и запустить непосредственно файл ildasm.exe или перейти в Пуск\Все программы\ Microsoft Visual Studio .NET 2003 \ Visual Studio .NET Tools \ Visual Studio .NET 2003 Command Prompt и в появившейся командной строке ввести

ildasm.exe

После того как приложение запустится, откроем только что созданную сборку (файл SimpleApp.exe из папки bin/Debug), (рис. 9.1).

Сборка SimpleApp, открытая с помощью утилиты ildasm.exe

Рис. 9.1. Сборка SimpleApp, открытая с помощью утилиты ildasm.exe

Как мы знаем, у класса всегда есть конструктор. Если он не был создан вручную, компилятор создаст конструктор по умолчанию. В утилите он называется .ctor. Также в созданной нами программе есть метод Main, который принимает строковый массив и не возвращает значений. Щелкаем на методе Main два раза. Открывается окно с MSIL (Microsoft Intermediate Language) кодом этого метода. Здесь видим строковую переменную ldstr со значением "Hello World" и запуск статического метода WriteLine класса Console (рис. 9.2).

MSIL-код метода Main

увеличить изображение
Рис. 9.2. MSIL-код метода Main

На рис. 9.2 я снова привел окно утилиты ildasm.exe: щелкнув на кнопку прокрутки, замечаем номер версии сборки — 1.0.2300.26912.

Частные сборки

Программы, которые написаны на языках, поддерживаемых библиотекой .NET Framework, и на C# в частности, компилируются в код MSIL, которые затем среда CLR (Common Language Runtime) преобразует в машинный код.

Частные сборки отвечают тем же требованиям, что и обычные, но используются они, как правило, только в одном приложении. При этом файл сборки может находиться в корневой или вложенных папках корневого каталога, используемого приложением. Приложение связывается со сборкой по ее частному имени, содержащемуся в коде MSIL. Среда CLR, использующая код MSIL, ищет частную сборку по ее имени.

Частные сборки отвечают тем же требованиям, что и обычные, но предназначены они для использования только в одном приложении и, как правило, лежат в той же папке, что и использующее их приложение. Частная сборка может находиться не только в корневой папке, но и во вложенных папках корневого каталога. Приложение ссылается на частную сборку по ее частному имени, которое содержится в метаданных. Когда среда CLR ищет частную сборку для применения, она использует частное имя сборки для поиска, причем поиск осуществляется в корневом каталоге и дочерних подкаталогах. Среда не будет искать сборку в родительской папке каталога.

Если мы хотим использовать любой путь для размещения сборки, то следует воспользоваться методом LoadFrom класса Assembly и указать ему адрес нахождения файла со сборкой. Класс Assembly находится в пространстве имен System.Reflection. Создайте новое консольное приложение и назовите его SimpleAssembly. Удалите все фрагменты кода, оставив только следующий участок:

using System;

namespace SimpleAssembly
{  
    public class Class
    {
      public static string HelloWorld()
      {
        return "hello world";
      }
    }
}

Скомпилировав приложение (Ctrl+Shift+B), мы получим сборку SimpleAssembly.dll. Теперь создадим еще одно консольное приложение — UsingLoadFrom, в папку bin/Debug которого помещаем файл SimpleAssembly.dll. В методе LoadFrom считываем содержимое сборки SimpleAssembly.dll:

using System;
using System.Reflection;

namespace UsingLoadFrom
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
      Assembly privateAss = 
Assembly.LoadFrom("SimpleAssembly.dll");
      MethodInfo info = 
     privateAss.GetTypes()[0].GetMethod("HelloWorld");
      Object obj = info.Invoke(null, null);
      Console.WriteLine("Результат выполнения метода: {0}", 
obj);
    }
  }
}

Результатом запуска этого приложения будет вывод на экран строки Hellow World — результата метода HelloWorld сборки SimpleAssembly.dll.

Рассматриваемые листинги предельно просты. Тем не менее на диске, прилагаемом к книге, вы найдете приложения SimpleAssembly и UsingLoadFrom (Code\Glava9\ SimpleAssembly и UsingLoadFrom).

Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/