Публикация WPF Core с помощью MSIXмножественные задачи


Начало редактирования №1

Чтобы воспроизвести это:

  1. Создайте новое «ванильное» приложение WPF, адресованное .Net Core 3.1.
  2. Добавьте Windows Application Packaging Project в решение (выполните действия, указанные в Настройте настольное приложение для упаковки MSIX в Visual Studio)
  3. Попробуйте "развернуть" на UNC-путь ...

Конец редактирования №1


Я нахожусь в процессе преобразования приложения WPF .net framework в .net core 3.1. Это приложение является «внутренним» инструментом, который мы всегда развертывали с помощью ClickOnce, чтобы разместить установку на общем UNC-пути. Так просто....

Сейчас я переписал его в .Net Core, и мне нужно его развернуть. Обнаружив, что ClickOnce больше не доступен, я понимаю, что должен пойти по маршруту «MSIX». Документация выглядит так, как будто она должна быть простой, но я думаю, мне не хватает нескольких вещей ...

1 - Мне пришлось изменить настройки разработчика с «Боковой панели» на «Режим разработчика» 2 - Он отлично работает на моем компьютере, но в Azure DevOps не работает 3 - и как мне его развернуть ...?

Давайте рассмотрим каждый по очереди.

1 - Боковая панель => Проблема с режимом разработчика

Я добавляю в свое решение новый проект упаковки приложений Windows, выбираю версию Windows 1909 как для целевой, так и для минимальной версии и устанавливаю свое приложение WPF в качестве точки входа. Я пытаюсь запустить это, и это заставляет меня перейти из «Боковой панели» в «Режим разработчика».

Это влияет только на меня как на разработчика ... если да, то ничего страшного. Я сомневаюсь, что конечные пользователи захотят это сделать.

2 - Сбой конвейера сборки Azure DevOps

Локально он компилируется отлично, даже в режиме выпуска, где для всех предупреждений установлено значение «Ошибка» и запущен FxCop. Отправьте его в Azure, и он говорит:

[ошибка] C: \ Program Files \ dotnet \ sdk \ 3.1.201 \ Sdks \ Microsoft.NET.Sdk \ target \ Microsoft.PackageDependencyResolution.targets (234,5): ошибка NETSDK1047: файл активов 'd: \ a \ 1 \ s \ MyApp \ MyApp \ obj \ project.assets.json 'не имеет цели для' .NETCoreApp, Version = v3.1 / win-x86 '.
Убедитесь, что восстановление выполнено и вы включили netcoreapp3.1 в TargetFrameworks вашего проекта.
Вам также может потребоваться включить win-x86 в RuntimeIdentifiers вашего проекта.

Хорошо

  • в моем YAML-файле есть шаг «Восстановить пакеты NuGet», предшествующий успешной сборке.
  • Я ищу свое приложение в файле проекта SKD и вижу <TargetFramework>netcoreapp3.1</TargetFramework>
  • Что касается RuntimeIdentifiers, я нашел ссылку Дополнения к формату csproj для .NET Core, поэтому добавлен <RuntimeIdentifiers>win-x64;win-x86</RuntimeIdentifiers> сразу под <TargetFramework>netcoreapp3.1</TargetFramework> (следует ли уточнить использование win10-x64;win10-x86?)

В любом случае, это не удалось с немного другим сообщением:

Было несоответствие между архитектурой процессора создаваемого проекта «MSIL» и архитектурой процессора эталонного «пути к моей dll», «x86». Это несоответствие может вызвать сбои во время выполнения. Рассмотрите возможность изменения целевой архитектуры процессора вашего проекта с помощью Configuration Manager, чтобы согласовать архитектуры процессоров между вашим проектом и ссылками, или принять зависимость от ссылок с архитектурой процессора, которая соответствует целевой архитектуре процессора вашего проекта.

3 - как мне его развернуть?

Из MSIX: современный способ развертывания настольных приложений в Windows, в котором говорится:

Чтобы создать фактический пакет MSIX, есть мастер, доступный в Project | Магазин | Создавайте пакеты приложений в Visual Studio.

На моей машине их нет ... Я даже дошел до установки рабочей нагрузки Visual Studio «Разработка универсальной платформы Windows». Я вижу "Развернуть" в меню "Сборка" ... но это оно .... где мне указать путь UNC?

Я думаю, что упускаю кое-что довольно фундаментальное ....

Соответствующая часть моего CSPROJ - это

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RuntimeIdentifiers>win-x64;win-x86</RuntimeIdentifiers>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

Пакетный проект:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'">
    <VisualStudioVersion>15.0</VisualStudioVersion>
  </PropertyGroup>
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|x86">
      <Configuration>Debug</Configuration>
      <Platform>x86</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x86">
      <Configuration>Release</Configuration>
      <Platform>x86</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|ARM">
      <Configuration>Debug</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|ARM">
      <Configuration>Release</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|ARM64">
      <Configuration>Debug</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|ARM64">
      <Configuration>Release</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|AnyCPU">
      <Configuration>Debug</Configuration>
      <Platform>AnyCPU</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|AnyCPU">
      <Configuration>Release</Configuration>
      <Platform>AnyCPU</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup>
    <WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
  </PropertyGroup>
  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
  <PropertyGroup>
    <ProjectGuid>08b169a2-6461-440b-afa1-ca35c7d98aa7</ProjectGuid>
    <TargetPlatformVersion>10.0.18362.0</TargetPlatformVersion>
    <TargetPlatformMinVersion>10.0.18362.0</TargetPlatformMinVersion>
    <DefaultLanguage>en-US</DefaultLanguage>
    <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
    <EntryPointProjectUniqueName>..\MyApp\MyApp.csproj</EntryPointProjectUniqueName>
    <PackageCertificateThumbprint>01C08F1E21D5624A484DB362BE4F056504B825CC</PackageCertificateThumbprint>
  </PropertyGroup>
  <ItemGroup>
    <AppxManifest Include="Package.appxmanifest">
      <SubType>Designer</SubType>
    </AppxManifest>
  </ItemGroup>
  <ItemGroup>
    <Content Include="Images\SplashScreen.scale-200.png" />
    <Content Include="Images\LockScreenLogo.scale-200.png" />
    <Content Include="Images\Square150x150Logo.scale-200.png" />
    <Content Include="Images\Square44x44Logo.scale-200.png" />
    <Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
    <Content Include="Images\StoreLogo.png" />
    <Content Include="Images\Wide310x150Logo.scale-200.png" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\MyApp\MyApp.csproj">
      <SkipGetTargetFrameworkProperties>True</SkipGetTargetFrameworkProperties>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
</Project>

(могу / должен я удалить ссылки на «DEBUG» и «ARM», которые, я не думаю, будут актуальными ??)

И манифест

<?xml version="1.0" encoding="utf-8"?>

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap rescap">

  <Identity
    Name="46aebba6-d403-4412-89c0-05279b36e54e"
    Publisher="CN=MyCompany"
    Version="2020.5.0.0" />

  <Properties>
    <DisplayName>MyApp</DisplayName>
    <PublisherDisplayName>MyCompany</PublisherDisplayName>
    <Logo>Images\StoreLogo.png</Logo>
  </Properties>

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
  </Dependencies>

  <Resources>
    <Resource Language="x-generate"/>
  </Resources>

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="$targetentrypoint$">
      <uap:VisualElements
        DisplayName="MyApp.Package"
        Description="MyApp.Package"
        BackgroundColor="transparent"
        Square150x150Logo="Images\Square150x150Logo.png"
        Square44x44Logo="Images\Square44x44Logo.png">
        <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
        <uap:SplashScreen Image="Images\SplashScreen.png" />
      </uap:VisualElements>
    </Application>
  </Applications>

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust" />
  </Capabilities>
</Package>

Спасибо!


person DrGriff    schedule 15.05.2020    source источник
comment
В Visual Studio 2019 должен быть файл Publish | Опция создания пакетов приложений доступна, если щелкнуть правой кнопкой мыши проект Windows Application Packaging Project.   -  person mm8    schedule 18.05.2020
comment
@ mm8 - ах, спасибо ... как я этого не заметил? Думаю, я не искал его в разделе «Опубликовать». Хотя я все еще получаю ошибку (см. Следующий комментарий), которая кажется достаточно ясной .... Я просто не совсем уверен, как исправить:   -  person DrGriff    schedule 18.05.2020
comment
Ошибка: There was a mismatch between the processor architecture of the project being built "MSIL" and the processor architecture of the reference "C:\MyApp\MyApp\bin\x86\Release\netcoreapp3.1\win-x86\MyApp.dll", "x86". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project   -  person DrGriff    schedule 18.05.2020
comment
В диспетчере конфигураций я вижу две записи: Project=MyApp,Configuration=Release,Platform=Any CPU,Build=checkedDeploy=unchecked и Project=MyApp.Package,Configuration=Release,Platform=Any CPU,Build=checkedDeploy=unchecked. Они такие же ... почему выше сообщение об ошибке?   -  person DrGriff    schedule 18.05.2020
comment
Если вы посмотрите в статье, все нацелено только на x86.   -  person mm8    schedule 18.05.2020
comment
@ mm8 Да, я это видел. Конечному пользователю действительно нужно запускать приложение как 64-битное, потому что оно загружает в память огромные текстовые файлы. Предположительно, цели x86 относятся не к конечной установке, а к созданию установочного пакета ?? В статье говорится, что если вы получаете сообщения об ошибках, откройте Configuration Manager и убедитесь, что ваши проекты нацелены на одну и ту же платформу. На их снимке экрана все показано как отладка (вы, конечно, хотите выпустить?), И хотя я могу выбрать x86 для проекта Packaging, у меня есть только Any CPU для моего приложения WPF (только другие варианты - ‹new› или ‹edit›).   -  person DrGriff    schedule 18.05.2020
comment
@ mm8 - я перешел на страницу проекта WPF и изменил его на x64, а затем в Configuration Manager установил для проекта Packaging значение x64. При публикации я выбрал только параметры X64 и Arm 64. Затем я получил файл активов «.... \ obj \ wappublish \ win-x64 \ project.assets.json», который не найден. Запустите восстановление пакета NuGet, чтобы создать этот файл. Восстановление NuGet НЕ исправило это. Его легко воспроизвести, создав совершенно новый ванильный проект WPF, ориентированный на Core 3.1 (если у вас есть время :-)).   -  person DrGriff    schedule 18.05.2020
comment
Затем я получил файл активов «.... \ obj \ wappublish \ win-x64 \ project.assets.json», который не найден. Запустите восстановление пакета NuGet, чтобы создать этот файл. Восстановление NuGet НЕ исправило это. Вы нашли решение этого?   -  person tech74    schedule 29.09.2020
comment
КСТАТИ. Этот подход MSIX вызвал у нас так много проблем - 1) это относительно длительный процесс для публикации, 2) на некоторых машинах разработчиков он работал, на других - нет, и 3) когда мы отправляли обновление, некоторые пользовательские машины обновлялись автоматически, в то время как другие этого не сделали. Все очень запутанно и отнимает много времени. Затем Microsoft повторно представила ClickOnce, и мы немедленно отказались от подхода MSIX для этого и с тех пор не оглядывались назад. Это быстро и работает, и все разработчики снова улыбаются.   -  person DrGriff    schedule 21.05.2021


Ответы (1)


В файл проекта .wapproj добавьте,

<PropertyGroup>
    <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
        None
    </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>
person R M Shahidul Islam Shahed    schedule 21.05.2021