修复 Desktop App Converter 生成的 AppX 清单中的缩放图像

Fixing scaled images in AppX manifest generated by Destop App Converter

我已经使用 Desktop App Converter 将我的 Win32 应用程序转换为 .appx

转换器无法正确转换应用程序图标。图标透明度丢失。虽然我已将此(错误?)报告给 Microsoft,但同时我想尝试手动转换图标。最后我想手动生成 .appx(使用 makeappx)。所以我需要创建 AppxManifest.xml.


问题是桌面应用程序转换器生成的 AppxManifest.xml 无效。所有图像路径都指向不存在的文件:

<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2" xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10">
  ...
  <Properties>
    ...
    <Logo>Assets\AppStoreLogo.png</Logo>
  </Properties>
  <Resources>
    <Resource Language="en-us" />
    <Resource uap:Scale="100" />
    <Resource uap:Scale="125" />
    <Resource uap:Scale="150" />
    <Resource uap:Scale="200" />
    <Resource uap:Scale="400" />
  </Resources>
  ...
  <Applications>
    <Application Id="WinSCP" Executable="WinSCP.exe" EntryPoint="Windows.FullTrustApplication">
      <uap:VisualElements DisplayName="WinSCP" Description="WinSCP" BackgroundColor="transparent" Square150x150Logo="Assets\AppMedTile.png" Square44x44Logo="Assets\AppList.png">
        <uap:DefaultTile Wide310x150Logo="Assets\AppWideTile.png" Square310x310Logo="Assets\AppLargeTile.png" Square71x71Logo="Assets\AppSmallTile.png">

Assets 文件夹中没有 AppStoreLogo.png 等文件,有如下文件:

AppStoreLogo.scale-100.png
AppStoreLogo.scale-125.png
AppStoreLogo.scale-150.png
AppStoreLogo.scale-200.png
AppStoreLogo.scale-400.png

因此 makeappx 无法使用生成的清单生成 .appx

虽然我显然可以通过将路径指向图像的 scale-100 变体来修复清单,但我觉得这不是正确的方法。

缩放图像肯定是有原因的。


我可以看到这些图像和比例相关的元素:

但我不明白这一切是如何结合在一起的。 我应该在清单中使用什么路径来维护缩放后的图像?

所有图标都由一个 .PRI 文件放在一起,该文件必须存在于包中并为这些资产生成。您可以尝试使用 makepri 将 .PRI 文件转储为 XML 格式并查看其内容。

我设法将 WinSCP 安装程序转换为 AppX package using Advanced Installer

您可以从 this link 下载软件包,其中包含我注意到的正确图标。只需提取包的内容并检查清单中的路径。

您也可以使用此软件包安装和测试应用程序,只需先安装 self-signed 证书,应用程序已使用该证书进行签名。 (当然是在虚拟机中

自定义您的包资源:

我构建了一个新的 appx 包,其中包含更多资源,适用于不同的大小。上面link可以下载,我更新了源

要获取 PRI 内容,您需要 运行 命令:makepri.exe dump

这是新包中的resources.pri.xml内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PriInfo>
 <ResourceMap name="MartinPrikryl.WinSCP" version="1.0" primary="true">
  <Qualifiers>
   <AlternateForm>UNPLATED</AlternateForm>
   <Scale>100,125,150,200,400</Scale>
   <TargetSize>256,48</TargetSize>
  </Qualifiers>
  <ResourceMapSubtree name="Files">
   <ResourceMapSubtree name="Assets">
    <NamedResource name="Store50x50Logo.png" uri="ms-resource://MartinPrikryl.WinSCP/Files/Assets/Store50x50Logo.png">
     <Candidate qualifiers="Scale-400" isDefault="true" type="Path">
      <Value>Assets\Store50x50Logo.scale-400.png</Value>
     </Candidate>
     <Candidate qualifiers="Scale-200" isDefault="true" type="Path">
      <Value>Assets\Store50x50Logo.scale-200.png</Value>
     </Candidate>
     <Candidate qualifiers="Scale-150" isDefault="true" type="Path">
      <Value>Assets\Store50x50Logo.scale-150.png</Value>
     </Candidate>
     <Candidate qualifiers="Scale-125" isDefault="true" type="Path">
      <Value>Assets\Store50x50Logo.scale-125.png</Value>
     </Candidate>
     <Candidate qualifiers="Scale-100" isDefault="true" type="Path">
      <Value>Assets\Store50x50Logo.scale-100.png</Value>
     </Candidate>
    </NamedResource>
    <NamedResource name="WinSCPSquare150x150Logo.png" uri="ms-resource://MartinPrikryl.WinSCP/Files/Assets/WinSCPSquare150x150Logo.png">
     <Candidate qualifiers="Scale-125" isDefault="true" type="Path">
      <Value>Assets\WinSCPSquare150x150Logo.scale-125.png</Value>
     </Candidate>
    </NamedResource>
    <NamedResource name="WinSCPSquare310x310Logo.png" uri="ms-resource://MartinPrikryl.WinSCP/Files/Assets/WinSCPSquare310x310Logo.png">
     <Candidate qualifiers="Scale-100" isDefault="true" type="Path">
      <Value>Assets\WinSCPSquare310x310Logo.scale-100.png</Value>
     </Candidate>
    </NamedResource>
    <NamedResource name="WinSCPSquare44x44Logo.png" uri="ms-resource://MartinPrikryl.WinSCP/Files/Assets/WinSCPSquare44x44Logo.png">
     <Candidate qualifiers="TargetSize-48" isDefault="true" type="Path">
      <Value>Assets\WinSCPSquare44x44Logo.targetsize-48.png</Value>
     </Candidate>
     <Candidate qualifiers="TargetSize-256, AlternateForm-UNPLATED" type="Path">
      <Value>Assets\WinSCPSquare44x44Logo.targetsize-256_altform-unplated.png</Value>
     </Candidate>
    </NamedResource>
    <NamedResource name="WinSCPSquare71x71Logo.png" uri="ms-resource://MartinPrikryl.WinSCP/Files/Assets/WinSCPSquare71x71Logo.png">
     <Candidate qualifiers="Scale-100" isDefault="true" type="Path">
      <Value>Assets\WinSCPSquare71x71Logo.scale-100.png</Value>
     </Candidate>
    </NamedResource>
    <NamedResource name="WinSCPWide310x150Logo.png" uri="ms-resource://MartinPrikryl.WinSCP/Files/Assets/WinSCPWide310x150Logo.png">
     <Candidate qualifiers="Scale-100" isDefault="true" type="Path">
      <Value>Assets\WinSCPWide310x150Logo.scale-100.png</Value>
     </Candidate>
    </NamedResource>
   </ResourceMapSubtree>
  </ResourceMapSubtree>
 </ResourceMap>
</PriInfo>

这是清单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" IgnorableNamespaces="uap rescap" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities">
  <Identity Name="MartinPrikryl.WinSCP" ProcessorArchitecture="x64" Publisher="CN=Caphyon-sha2, OU=AdvancedInstaller, O=Caphyon, E=support@caphyon.net" Version="5.9.3.7136"/>
  <Applications>
    <Application Id="WinSCP" Executable="VFS\ProgramFilesX86\WinSCP\WinSCP.exe" EntryPoint="Windows.FullTrustApplication">
      <uap:VisualElements DisplayName="WinSCP" Description="WinSCP" BackgroundColor="transparent" Square150x150Logo="Assets\WinSCPSquare150x150Logo.png" Square44x44Logo="Assets\WinSCPSquare44x44Logo.png">
        <uap:InitialRotationPreference>
          <uap:Rotation Preference="portrait"/>
          <uap:Rotation Preference="landscape"/>
        </uap:InitialRotationPreference>
        <uap:DefaultTile Square310x310Logo="Assets\WinSCPSquare310x310Logo.png" Square71x71Logo="Assets\WinSCPSquare71x71Logo.png" Wide310x150Logo="Assets\WinSCPWide310x150Logo.png"/>
      </uap:VisualElements>
    </Application>
  </Applications>
  <Resources>
    <Resource Language="en-US"/>
  </Resources>
  <Capabilities>
    <rescap:Capability Name="runFullTrust"/>
  </Capabilities>
  <Properties>
    <DisplayName>WinSCP</DisplayName>
    <PublisherDisplayName>Martin Prikryl</PublisherDisplayName>
    <Logo>Assets\Store50x50Logo.png</Logo>
  </Properties>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0"/>
  </Dependencies>
</Package>

如果您需要手动编辑您的资源并重建您的 resources.pri,请参考此白皮书和示例:

https://docs.microsoft.com/en-us/windows/uwp/globalizing/using-mrt-for-converted-desktop-apps-and-games

https://github.com/Microsoft/DesktopBridgeToUWP-Samples/tree/master/Samples/DotNetSatelliteAssemblyDemo

但是,管理应用包视觉资产的最简单方法是使用 Visual Studio 2017 中的包清单编辑器。

要将它用于转换后的应用程序,请创建一个空的 UWP 项目并在该项目中添加转换的输出(包括您的应用程序清单)。现在您可以使用编辑器来管理视觉资产、构建用于商店提交的包等等。 这是描述该过程的文档:https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-packaging-dot-net

谢谢, Stefan Wick - Windows 开发者平台

这可能是早期版本 makeappx 中的一些小故障。

一年多后再次尝试时,makeappx 现在可以编译 Desktop App Converter 生成的 AppxManifest.xml,尽管它看起来与以前差不多。


(Desktop App Converter 仍然无法正确生成应用程序图标)。