3

我工作的应用程序之一是 .NET Core WPF 应用程序,我们最近切换到使用桌面桥。我们注意到,如果用户使用开始菜单中的磁贴为应用程序创建桌面快捷方式或任务栏快捷方式,然后从所述快捷方式启动应用程序,应用程序将跳过检查更新(即使指定检查更新在 .appinstaller 文件中)。在打开应用程序后,该应用程序似乎也不会在后台检查更新,因为在用户重新启动后它仍保持相同的版本。

注意:当通过动态磁贴或开始菜单条目从开始菜单启动应用程序时,应用程序会更新并显示提示。我们已经验证所有用户和我们的开发机器都在使用 Windows 10 版本 1903。

这是 appinstaller 模板文件的示例:

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller Uri="{AppInstallerUri}"
              Version="{Version}"
              xmlns="http://schemas.microsoft.com/appx/appinstaller/2018">

  <MainBundle Name="{Name}"
              Version="{Version}"
              Publisher="{Publisher}"
              Uri="{MainPackageUri}"/>

  <UpdateSettings>
    <OnLaunch HoursBetweenUpdateChecks="0" ShowPrompt="true" UpdateBlocksActivation="true"/>
    <AutomaticBackgroundTask/>
    <ForceUpdateFromAnyVersion>true</ForceUpdateFromAnyVersion>
  </UpdateSettings>

</AppInstaller>

我在 MS 的 MSIX GitHub 存储库上询问了这个问题,但他们没有回应。在这一点上,我们想知道这里是否有其他人遇到过这个问题,他们是否能够确定解决方法或解决方法?有什么我们需要添加到我们的 .appxmanifest 文件或我们在 .appinstaller 文件中遗漏的其他内容吗?

编辑 MSIX 论坛上的相同问题,MSFT 很可能会在其中回复。

编辑 2

我们还在 Github 存储库和 VS 开发者社区上收到了 Microsoft 对此的回复。他们说他们会调查一下。当他们有更多信息时,我会再次更新或发布他们的答案。

https://github.com/MicrosoftDocs/msix-docs/issues/59

https://developercommunity.visualstudio.com/content/problem/776276/published-msixappx-does-not-check-for-updates-when.html?childToView=776800#comment-776800

4

2 回答 2

2

Microsoft 能够回复我们的票证,他们让我们知道,目前,当您从传统快捷方式(桌面/任务栏)启动应用程序时,Windows 10 (1903) 目前不支持运行更新程序。推荐的解决方法是从开始菜单或动态磁贴启动:

https://techcommunity.microsoft.com/t5/MSIX-Deployment/Update-process-not-started-lauching-the-program-by-shortcut-or/mp/902430

https://github.com/MicrosoftDocs/msix-docs/issues/59

https://developercommunity.visualstudio.com/content/problem/776276/published-msixappx-does-not-check-for-updates-when.html?childToView=776800#comment-776800

更新:

Tanaka Jimha / Huios 非常友好地为我们提供了使用 Windows 10 API 之一的解决方法: https ://github.com/MicrosoftDocs/msix-docs/issues/59#issuecomment-542927336

要使用它,您必须引用通常的 Windows 10 程序集,您可以手动或通过 NuGet 执行此操作。您可以在此处找到如何操作的文档: https ://docs.microsoft.com/en-us/windows/apps/desktop/modernize/desktop-to-uwp-enhance

注意:如果您使用的是 Rider 或 Resharper,如果您打算在与 XAML 视图相同的项目中使用这些程序集,我建议您将它们更新到 2019.2.3。早期版本存在 .NET Core 3.0 WPF 应用程序的错误,其中 UWP 库中的命名空间和类会导致奇怪的错误,例如 XAML 智能感知,表示网格、用户控件、窗口、堆栈面板等内容不明确。

添加它们后,您可以继续并开始使用 Windows.Management.Deployment 命名空间中的 API。这里有一些快速而肮脏的代码向您展示如何使用它,但您当然可以进行实验和/或参考上面链接中的 Tanaka 示例:

  • 要检查更新,您可以执行以下操作:

        public static async Task<bool> CheckForUpdates()
    {
        var currentPackage = Package.Current;
        var status = await currentPackage.CheckUpdateAvailabilityAsync();
        return status.Availability == PackageUpdateAvailability.Required || status.Availability == PackageUpdateAvailability.Available;
    }
    

这将使用您当前安装的应用程序包中的 URI 来查看您保存安装程序的任何位置是否有任何新版本。我可能应该指出,为了保持理智,你应该确保包的名称应该保持一致。

有很多不同的方法可以做到这一点,但我发现一种简单的处理方法是在应用程序安装程序项目的项目文件中使用AppPackageName元素,以确保每次发布后文件夹的名称都相同。

其次,要实际获取更新并下载并安装它,您可以执行以下操作:

public static async Task<bool> GetUpdates(string uriToUse)
{
    try
    {

        var packageManager = new PackageManager();
        var uri = new Uri(uriToUse);
        await packageManager.UpdatePackageAsync(uri, null, DeploymentOptions.ForceApplicationShutdown);
        return true;

    }
    catch (Exception e)
    {
        //Log the exception, or do something else, up to you
        return false;
    }
}

上面的 try catch up 在那里,因为 UpdatePackageAsync 如果有任何东西阻止它下载更新,则会引发异常。这可能是由多种原因引起的(已安装 IE 更新、证书错误等)。这就是为什么您可能希望在运行更新之前先在当前包上使用 CheckUpdateAvailabilityAsync()。

无论如何,希望这对遇到此问题的其他人有用,并且微软尚未发布涵盖传统应用程序快捷方式的 Windows 更新。

于 2019-10-16T03:13:10.230 回答
0

关于属性ShowPromptForceUpdateFromAnyVersion,您需要指向此架构 -xmlns="http://schemas.microsoft.com/appx/appinstaller/2018"在 xaml 中。它们在 1903 版本上可用。所以如果你的版本不是 1903,你可以去掉这两个属性。

于 2019-10-14T08:12:36.757 回答