При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Создание пакетов установки
Для установки на компьютер большинства программ достаточно просто вставить компакт диск с программой в дисковод и, следуя несложным инструкциям, скопировать ее на жесткий диск. В результате мы получаем возможность запускать программу одним из нескольких способов — щелкая на ярлыке на Рабочем столе, выбирая ее группу в меню Пуск или просто дважды щелкая на файле, расширение которого связано с этой программой. Мы не задумываемся, из каких частей состоит программа, как они взаимодействуют, а некоторые пользователи даже не представляют, где эти части находятся. В этой лекции мы научимся создавать дистрибутивы, или пакеты установки, предоставляющие возможность распространять программы с минимумом усилий со стороны конечного пользователя.
Сборки. Утилита 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).
Как мы знаем, у класса всегда есть конструктор. Если он не был создан вручную, компилятор создаст конструктор по умолчанию. В утилите он называется .ctor. Также в созданной нами программе есть метод Main, который принимает строковый массив и не возвращает значений. Щелкаем на методе Main два раза. Открывается окно с MSIL (Microsoft Intermediate Language) кодом этого метода. Здесь видим строковую переменную ldstr со значением "Hello World" и запуск статического метода WriteLine класса Console (рис. 9.2).
На рис. 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).