Posted on 20. December 2018

Упаковка .NET Core приложения с помощью Desktop Bridge

Read this article in your language IT | EN | DE | ES

Windows Desktop Bridge - это способ упаковки десктопных приложений для отправки в Microsoft Store или загрузки с любого ресурса. Это один из путей создания MSIX пакета. Вкратце: пользуйтесь им, как современным ClickOnce. Это формат упаковки с поддержкой автоматического обновления и пользователи уверены, что он не нанесет вред их системе и не загрязнит реестр.

Ранее Microsoft объявили о первых предварительных .NET Core 3 и Visual Studio 2019 версиях. Эти пробные варианты поддерживают создание графических ПК приложений с помощью .NET Core с использованием WPF и Windows Forms. Можно перенести существующее приложение из .NET Framework в .NET Core 3. Приложение, которое уже переключилось, – это NuGet Package Explorer; его открытый исходный код уже доступен на GitHub и служит отличным примером.

Если у Вас есть приложение, ориентированное на .NET Core 3, то у Вас могут возникнуть вопросы: «Как мне поделиться этим с моими пользователями?», «.NET Core 3 совершенно новый, у моих пользователей этого не будет!» «Мой IT-отдел не будет выпускать .NET Core 3 в течение года!»

Одна из действительно интересных вещей в .NET Core – это то, что он поддерживает полностью автономные приложения. То есть он не имеет внешних зависимостей. Вам не нужно ничего устанавливать, даже сам .NET Core. Вы можете скопировать вывод публикации проекта и передать его кому-нибудь для запуска. Это открывает огромные возможности, так как Вы, как разработчик, можете использовать нужные Вам фреймворки и рабочие версии, не беспокоясь о том, что помешаете другим приложениям, запущенным на компьютере, даже если рабочий вариант уже существует в box.

С полностью автономным приложением Вы сможете использовать Desktop Bridge для упаковки Вашей программы, чтобы пользователи легко могли её установить. На сегодняшний день шаблоны не поддерживают этот нестандартный сценарий, но, настроив должным образом, его можно запустить.

Вначале

Вам понадобится Visual Studio 2017 15.9 или, еще лучше, новый выпуск Visual Studio 2019 Preview. В настройках обязательно выберите рабочую нагрузку UWP для установки инструментов проекта упаковки. Загрузите .NET Core 3 Preview и создайте в нем первое WPF .NET Core приложение.

Подробно

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

Здесь Вы можете ознакомиться с готовым продуктом. Различия, показывающие определенные изменения, здесь.

Цель состоит в том, чтобы проект упаковки сам выполнял публикацию в основном приложении, а затем использовал эти выходные данные в качестве входных данных для упаковки. Изменения необходимо внести в следующие файлы:

 

  1. Основной проект приложения, пример NetCoreDesktopBridgeApp.csproj.
  2. Проект упаковки, пример NetCoreDesktopBridgeApp.Package.wapproj.

 

Проект приложения

Начнем с основного проекта приложения, .csproj или .vbproj файла. Добавьте <RuntimeIdentifiers>win-x86</RuntimeIdentifiers> к первой <PropertyGroup>. Это гарантирует, что восстановление NuGet предоставит ресурсы, специфичные для среды выполнения, и поместит их в project.assets.json файл. Затем вставьте следующее:

 

<Target Name="__GetPublishItems" DependsOnTargets="ComputeFilesToPublish" Returns="@(_PublishItem)">
  <ItemGroup>
    <_PublishItem Include="@(ResolvedFileToPublish->'%(FullPath)')" TargetPath="%(ResolvedFileToPublish.RelativePath)" OutputGroup="__GetPublishItems"></_PublishItem>
    <_PublishItem Include="$(ProjectDepsFilePath)" TargetPath="$(ProjectDepsFileName)"></_PublishItem>
    <_PublishItem Include="$(ProjectRuntimeConfigFilePath)" TargetPath="$(ProjectRuntimeConfigFileName)"></_PublishItem>
  </ItemGroup>
</Target>

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

 

  
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>

    <!-- Use RuntimeIdentifiers so that the restore calculates things correctly
         We'll pass RuntimeIdentifier=win-x86 in the reference from the Packaging Project 
    -->
    <RuntimeIdentifiers>win-x86</RuntimeIdentifiers>
  </PropertyGroup>

  <!-- Add the results of the publish into the output for the package -->
  <Target Name="__GetPublishItems" DependsOnTargets="ComputeFilesToPublish" Returns="@(_PublishItem)">
    <ItemGroup>
      <_PublishItem Include="@(ResolvedFileToPublish->'%(FullPath)')" TargetPath="%(ResolvedFileToPublish.RelativePath)" OutputGroup="__GetPublishItems"></_PublishItem>
    <_PublishItem Include="$(ProjectDepsFilePath)" TargetPath="$(ProjectDepsFileName)"></_PublishItem>
    <_PublishItem Include="$(ProjectRuntimeConfigFilePath)" TargetPath="$(ProjectRuntimeConfigFileName)"></_PublishItem>
    </ItemGroup>
  </Target>
</Project>

Проект упаковки

Далее нужно добавить в (.wapproj) проект упаковки следующее, еще одно свойство:

<DebuggerType> CoreClr</ DebuggerType>

в <PropertyGroup>, которая включает DefaultLanguage и EntryPointProjectUniqueName. Так Visual Studio говорит применять .NET Core отладчик. Примечание: чтобы использовать этот параметр, после установки Вам, возможно, нужно будет разгрузить / перезагрузить проект для VS. Если после изменения этого свойства система выдаст странную ошибку отладки, перезапустите VS, загрузите решение, и все должно заработать.

 

Затем найдите <ProjectReference ... элемент. Если его нет, щелкните правой кнопкой мыши на Application node и добавьте ссылку на приложение в Ваш основной проект. Добавьте следующие атрибуты: SkipGetTargetFrameworkProperties = "true" Properties = "RuntimeIdentifier = win-x86; SelfContained = true". Полная ItemGroup должна выглядеть примерно так:

 

<ItemGroup>
  <!-- Added Properties to build the RID-specific version and be self-contained -->
  <ProjectReference
    Include="..\NetCoreDesktopBridgeApp\NetCoreDesktopBridgeApp.csproj"
    SkipGetTargetFrameworkProperties="true"
    Properties="RuntimeIdentifier=win-x86;SelfContained=true"></ProjectReference>
</ItemGroup>

 

Наконец, когда проект почти закончен, добавьте следующий фрагмент после строки <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets"/>:

 

<!-- Additions for .NET Core 3 target -->
<PropertyGroup>
  <PackageOutputGroups>@(PackageOutputGroups);__GetPublishItems

 

В этом фрагменте измените NetCoreDesktopBridgeApp\NetCoreDesktopBridgeApp.exe, чтобы он соответствовал имени и исполняемому файлу Вашего основного проекта.

Обходное решение VCRedist

В качестве контрольной точки Вам нужно указать зависимость пакета от VCRedist в Package.appxmanifest файле. Добавьте в <Dependencies> элемент следующее:

<PackageDependency Publisher = "CN = Microsoft Corporation, O = Microsoft Corporation, L = Редмонд, S = Вашингтон, C = US" Имя = "Microsoft.VCLibs.140.00.UWPDesktop" MinVersion = "14.0.26905.0" />
. Когда пользователи установят Ваше приложение, Windows автоматически подтянет эту зависимость из хранилища.

 

Сборка и отладка

С указанными выше компонентами, Вы можете установить проект упаковки в качестве стартапа и выполнить отладку в обычном режиме. Он создаст программу и развернет его в локальном приложении. Выходные данные можно увидеть в bin\AnyCPU\<configuration>\AppX каталоге Вашего проекта упаковки. Он должен содержать больше файлов, чем в вашем главном приложении, поскольку в нем будет автономная .NET Core среда выполнения.

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

Развертывание приложения

Существует два основных варианта развертывания пакета:

 

  1. Загрузка с помощью AppInstaller файла. Это замена ClickOnce.
  2. Microsoft Store. Пакет может быть отправлен в Store для распространения.

 

Двойная загрузка

Начиная с Windows 10 1803, загруженные приложения могут автоматически обновляться с помощью .appinstaller файла. AppInstaller является альтернативой ClickOnce для большинства сценариев. В документации описывается, как создать этот файл при публикации и поместить его в UNC-путь, общую папку или HTTPS-папку.

Если Вы загружаете контент, то нужно использовать сертификат подписи кода, которому доверяют Ваши пользователи. Для предприятия это может быть документ внутреннего центра сертификации, для общественности он должно быть получен в государственном органе. У DigiCert есть отличное предложение для сертификатов подписи кода, $ 74 / год для обычного и $ 104 / год для EV по специальной ссылке. После получения сертификата Вам необходимо обновить Package.appxmanifest, чтобы использовать его. В данной статье нет информации об автоматической подписи кода, но Вы можете ознакомиться с проектом службы подписи кода здесь.

Microsoft Store

Microsoft Store – отличный способ, чтобы Ваши пользователи узнали о приложении. Он обрабатывает подписывание кода, распространение и обновление. Более подробная информация о том, как подать приложение в Store, здесь и здесь.

 

Источник



Exception: Stack empty.
Comments are closed