При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Создание пакетов установки
Настройка политики выполнения сборок и контроля версий
Консоль MMC предоставляет возможность настройки политики выполнения сборок и контроля версий. Рассмотрим практическое использование контроля версий сборок. Создайте новое консольное приложение и назовите его AssVersion. Полный листинг этого приложения:
using System; namespace LibVersion { /// <summary> /// Класс для тестирования контроля версий сборок. /// </summary> public class MyClass { /// <summary> /// Метод, возвращающий текущую версию сборки. /// <summary> /// <returns></returns> public static string GetString() { return "Version 1"; } } }
В файле AssemblyInfo.cs изменяем значения атрибутов [assembly:]:
// Жестко прописываем версию сборки [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyDelaySign(false)] // Указываем закрытый ключ, созданный утилитой sn.exe [assembly: AssemblyKeyFile("C:\\StrongKey.snk")] [assembly: AssemblyKeyName("")]
При попытке скомпилировать приложение появляется ошибка — наше приложение не содержит точки входа:
Program 'D:\Code\Glava9\AssVersion\obj\Debug\ AssVersion.exe' does not have an entry point defined
Мы удалили метод Main, поэтому возникает это исключение при попытке создания консольного приложения. Нам нужно скомпилировать проект как класс библиотеки, для этого в окне Solution Explorer щелкаем правой кнопкой на названии проекта AssVersion и в появившемся контекстном меню выбираем пункт Properties. Изменяем свойство Output Type на значение Class Library, закрываем окно свойств проекта и снова скомпилируем его.
Добавим теперь созданную сборку в GAC. В консоли MMC щелкаем правой кнопкой мыши на названии Assembly Cache и выбираем пункт Add… (рис. 9.21).
Переходим в папку bin/Debug и выбираем файл AssVersion.dll. В результате в списке сборок появляется добавленная сборка AssVersion.dll (рис. 9.22).
Создадим теперь новое консольное приложение UsingMyClassFromGAC, которое будет ссылаться на эту сборку и использовать ее метод. В окне Solution Explorer щелкаем правой кнопкой мыши на папке References и в появившемся контекстном меню выбираем пункт Add Reference (рис. 9.23).
В появившемся окне Add Reference нажимаем кнопку Browse и выбираем сборку AssVersion.dll из каталога AssVersion\bin\Debug\ AssVersion.dll. Подключаем пространство имен для использования этой сборки и вызываем ее метод:
using System; //Подключаем пространство имен: using AssVersion; namespace UsingMyClassFromGAC { class Class1 { [STAThread] static void Main(string[] args) { // Получаем строку с помощью метода GetString string stringFromMethod = MyClass.GetString(); // Выводим строку на экран Console.WriteLine(stringFromMethod); } } }
Компилируем приложение и затем запускаем его из командной строки2При запуске приложения непосредственно из среды Visual Studio .NET происходит прямое обращение по ссылке к сборке, находящейся в своей папке, а при запуске через командную строку CLR проверяет наличие сборки в GAC. Visual Studio .NET (рис. 9.24).
увеличить изображение
Рис. 9.24. Результат запуска приложения UsingMyClassFromGAC из командной строки
Изменим теперь сборку AssVersion — возвращаемое методом значение — на Version 2:
public static string GetString() { return "Version 2"; }
Изменим файл AssemblyInfo.cs:
// Жестко прописываем новую версию сборки [assembly: AssemblyVersion("2.0.0.0")]
Скомпилируем сборку и добавим ее в GAC. В результате в списке сборок появится две версии (рис. 9.25).
Снова запустим приложение UsingMyClassFromGAC из командной строки. Результат не изменился, по-прежнему выводится текст Version 1.
Перейдем теперь к настройке управления версиями сборок. В консоли управления .NET Framework 1.1 открываем вкладку Configured Assemblies и выбираем задачу Configure an Assembly (рис. 9.26).
В открывшемся окне конфигурирования сборки (рис. 9.27) переключатель стоит по умолчанию на значении Choose an Assembly from the assembly cache, нажимаем кнопку Choose Assembly для перехода к списку сборок.
Далее появляется список сборок GAC. Прокручиваем список до конца, выбираем AssVersion версии 1.0.0.0 и нажимаем кнопку Select (рис. 9.28).
Далее нажимаем кнопку "Готово". В появившемся окне свойств сборки переключаемся на вкладку Binding Policy и в поле Requested Version вводим номер первой версии сборки (1.0.0.0), а в поле New Version — номер второй версии сборки (2.0.0.0) (рис. 9.29).
Нажимаем кнопку OK, завершая конфигурирование сборки. В результате этих действий мы определили порядок версий сборок AssVersion, и теперь среда CLR при обращении в GAC будет извлекать более новую версию сборки. В командной строке Visual Studio .NET снова запустим приложение UsingMyClassFromGAC.exe, которое будет извлекать версию сборки 2.0.0.0 (рис. 9.30).
увеличить изображение
Рис. 9.30. После завершения конфигурирования сборки приложение UsingMyClassFromGAC.exe использует новую версию AssVersion 2.0.0.0
На диске, прилагаемом к книге, вы найдете приложения AssVersion и UsingMyClassFromGAC (Code\Glava9\ AssVersion и UsingMyClassFromGAC).