修复 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
变体来修复清单,但我觉得这不是正确的方法。
缩放图像肯定是有原因的。
我可以看到这些图像和比例相关的元素:
清单中的 <Resources>
元素列出了所有比例。
还有 resources.*.pri
个文件,它们引用缩放后的图像。
resources.pri
resources.scale-100.pri
resources.scale-125.pri
resources.scale-150.pri
resources.scale-200.pri
但我不明白这一切是如何结合在一起的。 我应该在清单中使用什么路径来维护缩放后的图像?
所有图标都由一个 .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,请参考此白皮书和示例:
但是,管理应用包视觉资产的最简单方法是使用 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 仍然无法正确生成应用程序图标)。
我已经使用 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
变体来修复清单,但我觉得这不是正确的方法。
缩放图像肯定是有原因的。
我可以看到这些图像和比例相关的元素:
清单中的
<Resources>
元素列出了所有比例。还有
resources.*.pri
个文件,它们引用缩放后的图像。resources.pri resources.scale-100.pri resources.scale-125.pri resources.scale-150.pri resources.scale-200.pri
但我不明白这一切是如何结合在一起的。 我应该在清单中使用什么路径来维护缩放后的图像?
所有图标都由一个 .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,请参考此白皮书和示例:
但是,管理应用包视觉资产的最简单方法是使用 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 仍然无法正确生成应用程序图标)。