27 апреля 2017 г.

Часть 4. Clickonce приложение. Что умеет утилита ClickOnceUtil4 и не умеет Mage и её аналоги.

Оглавление


В этой статье я постараюсь описать о имеющихся на текущий момент механизмов предотвращения ошибочных ситуаций при сборке ClickOnce приложения путем уведомления пользователя. Подобные уведомления я не видел в других приложениях. Все проверки со ссылками на страницы, где они описаны, есть в разделе справки. 
  • Ошибка, которую может допустить не знающий пользователь - это создать приложение, у которого исполняемый файл настроен на использование манифеста по умолчанию: "Embed manifest with default settings". Данная проблема хорошо описана на странице Error deploying ClickOnce application - Reference in the manifest does not match the identity of the downloaded assembly. Её решения это в свойстве проекта исполняемого файла перейти в раздел Application и в ComboBox с названием "Manifest" требуется выбрать "Create application without a manifest".
    Почему так происходит? Дело все в том, что в манифест с настройками приложения (Не путать с файлом манифеста ClickOnce), зашивается внутрь исполняемого файла. Манифест представляет из себя XML и содержит, в основном, информацию о запуске для ОС. Такую как например обязательный запуск с правами администратора. Visual Studio дополнительно пишет туда имя сборки <AssemblyIdentity />, которая, по каким то причинам, может отличаться от <AssemblyIdentity />, содержащейся в .manifest файле собранного ClickOnce приложения. Тем самым при запуске мы получим ошибку.
    На данный момент у меня идёт прямая проверка на наличие и отсутствие манифеста в файле. Позже можно добавить проверку на соответствие AssemblyIdentity файла .manifest и той, что внутри исполняемого файла.  Самый простой способ понять есть ли вшитый в файл манифест, это отрыть исполняемый файл блокнотом, и в конце которого можно обнаружить эту XML с манифестом.

    Ниже приведен пример сообщения об ошибке, описанной ранее ситуации, перед началом сборки:

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". И сразу хочу заметить, что в папку не следует заходить а просто выбирать ее в родительском каталоге. После выбора нам откроется меню действий и настроек:


12 апреля 2017 г.

Часть 2. Clickonce приложение. Создание с нуля используя утилиту mage.exe.

Оглавление


Первым делом стоит ответить на вопросы:
  • Насколько клиенту важна Security политика и выводимые предупреждения у пользователей при установке? 
  • На сколько администраторы компании готовы вам содействовать в настройке?
Потому, что для повышения безопасности приложения в политиках домена придется раздать всем клиентам корпоративной сети заказчика сертификат с подписью манифеста и добавлением вашего сайта в доверенные.
При чем тут вообще сертификаты и прочее? Дело в том, что каждая сборка ClickOnce приложения подписывается или не подписывается сертификатом. В случае если подпись имеется, это дает возможность клиенту быть уверенным, что получив файлы приложения по сети они были созданы поставщиком, а так же в ходе хранения у заказчика не были заражены или изменены. Это достигается путем подсчета контрольной суммы не только файлов вашего решения, но и файлов ClickOnce приложения. В полном объеме это все описано в статье Общие сведения о развертывании доверенных приложений, если вы уже попробовали развернуть и запустить ClickOnce приложение у себя, то уже заметили данное сообщение при запуске:


На нем ясно написано, что Publisher (Поставщик) не известен, хотя поле могло бы быть заполнено вашей организацией. Так же снизу написано предупреждение объясняющее, к чему может привести пренебрежение безопасностью. Если для клиента главный девиз "Что бы работало", то пропускайте заморочки с постоянным сертификатом и используйте временные сертификаты  если они необходимы или же не используйте цифровую подпись.

Приведу пример запуска приложения с полностью настроенной политикой безопасности и подписью:

Важно понимать! Что если у заказчика нет домена, то установка сертификатов придется делать вручную. То же самое относится к компьютерам, которые являются портативными и не введены в домен.

Практичные способы развёртывания.

Известные мне способы создания развёртываемых ClickOnce приложений приведены ниже:
  1. Используя Visual Studio, но как мне известно, студия не умеет делать приложения без подписи.
  2. Используя утилиты Mage.exe / MageUI.exe - идущие в поставке Windows SDK. С их помощью можно создавать приложение с нуля, подписывать сборки и обновлять их.
    Приведу известные мне проблемы:
    • Самый главный минус, то что mage.exe не умеет проставлять атрибут mapFileExtensions при создании .application. Поэтому не получится создать ClickOnce приложение с использованием файлов с расширением .deploy
    • Еще один минус, это отсутствие возможности поменять стратегию обновления. По умолчанию значение:
      <deployment install="true" mapFileExtensions="true">
          <subscription>
            <update>
              <expiration maximumAge="0" unit="days" />
            </update/>
          </subscription>

        </deployment>
      Это соответствует поведению, когда при появлении новой версии она будет загружена во время работы, а не перед запуском программы. Соответственно подменить на beforeApplicationStartup обновление при создании с нуля придется самому.
  3. Создание своей утилиты, которая наполняет msbuild  скрипт <Project /> содержащий <GenerateApplicationManifest /> и <GenerateDeploymentManifest />. Данный способ является велосипедом, но дает возможность упростить создание ClickOnce приложения, сведя к минимуму задаваемые настройки. Самый главный плюс это возможно создавать не подписанные файлы манифестов, задания MapFileExtensions и прочих свойств. Как это сделать используя студию и Mage.exe я не нашел.
  4. Используя Microsoft.Build.Tasks.v4.0.dll реализовать работу по созданию ClickOnce приложения минуя msbuild (как делает mage.exe).
Теперь остановимся на каждом пункте поподробнее.