25 апреля 2017 г.

Часть 3. Clickonce приложение. Альтератива Mage.exe. ClickOnceUtil4.exe утилита для создания ClickOnce приложений.

 Скачать исходный код:
https://bitbucket.org/sergey_vaulin/clickonceutil/src
Скачать исполняемый файл:
https://drive.google.com/drive/folders/0B8D3_EaMiiaNMmJWUkFXelhJdW8?usp=sharing

Как и обещал в прошлой статье, здесь я постараюсь написать особенности созданной мной утилиты для создания ClickOnce приложения, описать "набитые шишки", а так же показать, что ClickOnce приложение можно создать в один щелчок и сразу посмотреть результат. Цель проекта - иметь инструмент как mage, но с недостающими "плюшками". Так же прошу не судить строго за ошибки в английским. И вообще это утилита будет полезна тем, кто не использует Visual Studio в качестве среды разработки.

Основные особенности.

  1. Пользовательское приложение должно быть написано под .NET Framework 4.х версию, а для .NET Framework 3.5 надо тестировать.
  2. Весь функционал заключен в один файл.
  3. Корректно работает с .deploy файлами, а так же без проблем делает переименование.
  4. Выводит предварительный результат построения, а так же уведомляет о известных мне ошибках и проблемах.
  5. Умеет в один щелчок чистить папку с кэшем, а так же открывать IE с результатом работы.
  6. Имеет ссылки на часто используемые (с моей точки зрения) статьи.
  7. Имеет возможность менять имя экземпляра вашего приложения. 
  8. При обновлении происходит пере подсчет всех контрольных сумм.
  9. Умеет вычислять DeployUrl приложения, если папка находится в виртуальном каталоге IIS.
  10. При создании заполнено минимальное количество полей, и будут использованы самые (на мой взгляд) популярные настройки. А именно:
    • Обновление перед запуском
    • Приложения можно установить и запускать в оффлайн режиме.
    • Создавать ярлык на рабочем столе
    • Использовать .deploy расширение к файлам приложения

 Сценарии работы. 

Какие сценарии можно выполнять используя это приложение:
  1. Создание ClickOnce приложение с нуля.
  2. Удалить ClickOnce приложение, конвертировать его в исходное приложение. То есть удалить все файлы, которые нужны для ClickOnce и переименовать все файлы, убрав .deploy расширение в случае использования такового.
  3. Обновление текущего приложение, изменения настроек. Либо путем пересчета контрольной суммы (в случае непредумышленной модификации) вернуть приложение в рабочее состояние. Но тут стоит учитывать, что если манифесты приложения нужно подписать, то следует это сделать после обновления.
  4. Возможность подписать приложение существующим ключом, либо в случае необходимости использовать сгенерированный так называемый "Тестовый ключ", аналогичный тому, который создает Visual Studio.
  5. Очистка ClickOnce кэша
Теперь постараюсь продемонстрировать все сценарии поподробнее.

Предварительная подготовка.

Для простоты и наглядности демонстрации я сделал два подготовительных шага:
  1. Создал простое приложение, состоящее из первого исполняемого файла и выводящее место расположения и версию. Сам файл расположил по пути C:\IISRoot\DELME. Само приложение не имеет цифровой подписи (не имеет заполненного PublicKeyToken), что потребовало бы его подписи.

  2.  Затем папку C:\IISRoot\DELME я сделал виртуальным каталогом в IIS, что бы при создании сразу продемонстрировать feature, с заполнением DeploymentUrl, но никто не запрещает самому указать желаемый путь без размещения в public доступе IIS.

Создание приложения с нуля.

Начальная подготовка закончена, теперь запускаем мою утилиту и жмем кнопку выбора каталога "Choose", переходим в папку, содержащую наше приложение и в случае если директория подходит для работы, то кнопка "Select Folder" станет активной.


В диалоге снизу есть описание всех вариантов папок, поэтому нам для создания требуется папка помеченная как "Can be an application". И сразу хочу заметить, что в папку не следует заходить а просто выбирать ее в родительском каталоге. После выбора нам откроется меню действий и настроек:


В доступных действиях будет только "New" (означающее создание нового приложения). В настройках (Settings шаг 3) расположены параметры вашего ClickOnce приложения, ниже привожу их описание:
  1. "Entry point executable file" - тут мы выбираем файл, который будет являться точкой входа в ваше приложение, иными словами после установки этот файл будет запущен.
  2. "Application instance name" - данный параметр является опциональным и следует менять его только в ситуации, если, к примеру, ваш сервер будет предоставлять установку 2-х экземпляров одного и того же приложения, то есть из 2-х мест пользователь может установить ваше приложение. В этом случае первая установка пройдет без проблем, но как только вы попробуете установить второй экземпляр, то получите ошибку:

    "Unable to install this application because an application with the same identity is already installed. To install this application, either modify the manifest version for this application or uninstall the preexisting application."

    Говорящая о том, что ваше приложение уже установлено и что бы его установить из нового места потребуется удалить старый экземпляр. В этом случае в поле Application instance name можете добавить какой то (отличный от имени экземпляра 1 префикс), тем самым поменяв название вашего приложения и избавив от ошибки.
  3. "ClickOnce application version" - данное поле, содержит версию вашего ClickOnce приложения. Не стоит путать с версией ваших сборок. При этом версия сборок(и) может совпадать или быть старше\младше версии вашего ClickOnce приложения. Иными словами они никак не взаимосвязаны.
  4. ".Application file" - настройки расположенные под этой строкой относятся к развертыванию и будут располагаться в файле с расширением .application. Описание всех настроек находятся по ссылке DeployManifest.
  5. ".Manifest file" - настройки расположенные под этой строкой относятся к манифесту приложения и будут располагаться в файле с расширением .manifest. Описание всех настроек находятся по ссылке ApplicationManifest
Теперь по поводу настроек и значений заданных по умолчанию.
  • Под каждой настройкой имеется описание, оно не всегда лаконично читаемое, так как является текстом из файла Microsoft.Build.Tasks.v4.0.xml в котором содержится описания всех свойств, методов и классов из Microsoft.Build.Tasks.v4.0.dll библиотеки. Она как раз таки и предоставляет API для создания самого приложения. Так же можно заметить, что текст на msdn будет совпадать с текстом описания настройки.
  • Как было сказано в начале статьи, изначальные настройки сделаны на то, что приложение будет скачиваться и устанавливаться клиентом, сама установка обновления должна происходить перед запуском, на рабочем столе будет создан ярлык, и с целью решения возможных отсутствий прав на скачивание .DLL и .EXE файлов по умолчанию установлена настройка "MapFileExtensions".
  • Вы наверное заметили, что поле DeploymentUrl заполнено строкой описывающей полный доступ к нашей настроенной директории, это моя "фишка" дающая возможность в случае если файлы лежат в виртуальном каталоге IIS, то утилита найдет путь, по которому папка с приложением доступна по сети и подставит будущее имя .application файла (который будет скачиваться и устанавливаться клиентом). Тем самым избавит нас от заполнения валидным этого поля. Данная фича это шаг на пути быстрой сборки приложения. ВАЖНО, что в случае если папка не лежит в виртуальном каталоге IIS, вам придется самому указывать будущий путь, по которому будет доступен ваш .application файл.
    Значение по умолчанию будет http://domain/subfolder/APPNAME.application и следует обязательно поменять на будущий адрес.
Отлично! Если DeploymentUrl автоматически заполнился, то можно произвести сборку и проверку результата. Поэтому нажимаем кнопку "Build" и видим диалог, с описанием важных (на мой взгляд) параметров, а так же в случае возможных проблем или действий требующих внимания параметры будут помечены с префиксом (!).
 

В данном случае в окне PreBuild написаны параметры будущего запуска и работы, а так же важна пометка, что приложение в меню пуск будет иметь имя по умолчанию. В нашем случае это будет пункт меню пуск с название WpfApplication и если это не принципиально, то можно не обращать внимания. Жмем "Okay" видим, что "Operation completed successfully!" затем список действий должен поменяться и нам станет доступна кнопка "Browse" жмем ее, тем самым приложение будет запущено в Internet Explorer через DeploymentUrl. В результате у меня появилось окно установки (ниже).

Жмем "Install"  и видим результат нашей работы:


Наше приложение запустилось, путь его запуска это папка внутри кэша ClickOnce приложений а версия самого исполняемого файла не изменено и осталась 1.0.0.0.
Создание успешно завершено! И потребовало минимум усилий.

Сценарий удаления ClickOnce путем конвертации в исходное.

Сценарий, мне кажется, не очень распространенный, но у меня в жизни было несколько моментов, когда нужно было запустить клиента, но под рукой было только ClickOnce приложение. Сценарий конвертации или "удаления" очень прост - мы у все файлов убираем .deploy расширение, и сопутствующие созданию .application и .manifest файлы.
Что бы произвести удаление требуется сначала выбрать папку, затем в пункте меню действий (Actions) выбрать "Remove" и нажать "Build".

После чего исходное приложение (Верхняя картинка) примет вид (Нижняя картинка).

После конвертации можно сразу же создавать новое на основе "Чистого" приложения.

Сценарий обновление существующего приложения


Не маловажным считаю сценарий, при котором следует обновить существующую конфигурацию или в результате каких то правок файлов манифеста пересчитать контрольную сумму и обновить ее. Для этого запускаем утилиту, жмем "Choose" и находим директорию которая содержит ClickOnce приложение.

Как видите справа можно увидеть предварительную информацию, о приложении содержащемся в выбранной директории. Жмем "Select Folder" затем в меню выбора действий (Available actions) выбираем "Update" и теперь можно начать изменение настроек:

Я поменял название "Product" со значений заданного в файле на "My product". Нажал "Build" и Browse. В диалоговом окне, с предложением установить программу, названия поменялись и имело значение поля Name равным "My product".


Если БЕЗ ИЗМЕНЕНИЙ запустить "Build" действия "Update", то это приведет к обычному пересчёту контрольных сумм и сборке приложения без подписи.

Сценарий подписи ClickOnce приложения.

Сам сценарий подписи рекомендовано использовать всегда, но возможен вариант, когда приложение не подписывается. Для сценария подписи вам понадобится уже собранное ClickOnce приложение находим его в диалоге "Choose folder", в поле "Available actions" выбираем "Resigning" затем вам станут доступны настройки:
  • "Timestamp server URL" тут можно указать url вашего Timestamp сервера сертификатов. Для ознакомление стоит почитать ClickOnce и технология Authenticode. Так же в меню справки есть ссылка на англоязычную статью и список серверов предоставляющих сертификаты.
  • "Choose certificate" тут вы можете выбрать существующий сертификат и задать в случае необходимости пароль к нему.
  • Так же есть возможность создать временный сертификат (аналогичный тому, что создает студия) и подписать им.
В каких случая стоит обязательно подписывать ClickOnce приложение? 

Только когда точка входа это подписанный файл (имеющий заданный PublicTokenKey=XXXXX). В этом случае, если создать ClickOnce приложения без подписи, тогда при попытки установить мы получим ошибку:
System.Security.Cryptography.CryptographicException
- SignatureDescription could not be created for the signature algorithm supplied.
И кстати, приложение перед сборкой, уведомит пользователя о необходимости подписать приложение.

Очистка ClickOnce кэша

Все установленные ClickOnce приложения расположены в локальном кэше лежащем в папке с профилем. Кэш является изолированным для локальных пользователей и располагается по адресу "%userprofile%\AppData\Local\Apps\2.0". Его очистить можно вручную, попросту удалив папку 2.0. В результате последующий запуск приложения по ярлыку приведет к повторной установке.
Внимание! Следует знать, что если ваше приложение размещает ярлык на рабочем столе, то это не обычный .lnk ярлык на файл. Это специальное расширение ".appref-ms" и формат файла. Внутри содержится строка с исходным адресом установки, тем самым если приложение было удалено, запуск ярлыка приведет к повторной установке.
Когда полезно делать очистку кэша?
В ходе долгой работы клиента, он может активно устанавливать и обновлять различные экземпляры приложений. Это может быть поводом для её очистки, так как все версии файлов остаются на жестком диски и занимают место. Бывают кейсы, когда происходит обновление файлов приложения, но при это номер версии не меняется и при попытке запуска программа обновления скажет, что ваш экземпляр уже установлен. Для удаления можно воспользоваться "Установка\удаление программ" либо почистить папку с кэщем. Для упрощении процедуры очистки можно воспользоваться кнопкой "Clean" которая удаляет содержимое папки 2.0.


Итоги работы.

Сама утилита работает достаточно стабильно, и если вы знакомы с файлами .application и .manifest, то разобраться с её функционалом вам не составит труда. Сейчас хотелось бы написать чего не хватает утилите:
  • Пока не сделан функционал выполнения всех операций описаны выше через командную строку. Если хочется увидеть это, то пишите на email.
  • Один из минусов, это то, что файл .application и .manifest создаются в одной директории, и нет возможности как при создании приложения средствами Visual Studio использовать для нахождения файла манифеста смещение. Но в целом не считаю это большой проблемой.
  • Была задумка возможности создания Setup.exe с полной костомизацией пакетов для установки, но пока нет времени и сил разбираться в этом направлении. При этом возможность такая есть.
Далее я постараюсь описать "Features" (особенностях) этой утилиты поподробнее. В статье Часть 4. Что умеет утилита ClickOnceUtil4.exe и не умеет Mage и аналоги

Комментариев нет:

Отправить комментарий