.NET Core WPF桌面桥-桌面快捷方式/任务栏快捷方式绕过检查更新

.NET Core WPF桌面桥-桌面快捷方式/任务栏快捷方式绕过检查更新,wpf,uwp,desktop-bridge,msix,appinstaller,Wpf,Uwp,Desktop Bridge,Msix,Appinstaller,我工作的一个应用是一个.NET核心WPF应用程序,我们最近切换到使用桌面网桥。我们注意到,如果用户使用“开始”菜单中的互动程序为应用程序创建桌面快捷方式或任务栏快捷方式,然后从所述快捷方式启动应用程序,则应用程序将跳过更新检查(即使指定在.appinstaller文件中检查更新)。此外,该应用程序似乎在打开后不会在后台检查更新,因为在用户重新启动后,它仍保持相同的版本 注意:当通过live互动程序或“开始”菜单项从“开始”菜单启动应用程序时,应用程序会更新并显示提示。我们已经验证了所有用户和我们

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

注意:当通过live互动程序或“开始”菜单项从“开始”菜单启动应用程序时,应用程序会更新并显示提示。我们已经验证了所有用户和我们的开发机器都在使用Windows10版本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>

编辑2

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


关于属性,您需要指向此架构-
xmlns=”http://schemas.microsoft.com/appx/appinstaller/2018“
在xaml中。1903年的版本也有。因此,如果您的版本不是1903,您可以删除这两个属性。

Microsoft能够响应我们的通知单,他们告诉我们,当前,当您从传统快捷方式(桌面/任务栏)启动应用程序时,Windows 10(1903)不支持运行更新程序。建议的解决方法是从“开始”菜单或活动互动程序启动:

更新:

Tanaka Jimha/Huios非常友好地为我们提供了使用Windows 10 API之一的解决方案:

要使用它,您必须引用常用的Windows 10程序集,您可以手动或通过NuGet执行这些操作。您可以在此处找到如何执行此操作的文档:

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

添加它们后,可以继续并开始在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;
    }
    
    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;
        }
    }
    
    公共静态异步任务CheckForUpdates()
    {
    var currentpack=Package.Current;
    var status=wait currentPackage.CheckUpdateAvailabilityAsync();
    返回状态.Availability==PackageUpdateAvailability.Required | | status.Availability==PackageUpdateAvailability.Available;
    }
    
这将使用您当前安装的应用程序包中的URI来查看在您保存安装程序的任何位置是否有任何新版本。我可能应该指出,为了保持理智,您应该确保包的名称保持一致

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

其次,要真正获得更新并下载和安装,您可以执行以下操作:

    public static async Task<bool> CheckForUpdates()
{
    var currentPackage = Package.Current;
    var status = await currentPackage.CheckUpdateAvailabilityAsync();
    return status.Availability == PackageUpdateAvailability.Required || status.Availability == PackageUpdateAvailability.Available;
}
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;
    }
}
公共静态异步任务GetUpdates(字符串urituse)
{
尝试
{
var packageManager=new packageManager();
var uri=新uri(urituse);
等待packageManager.UpdatePackageAsync(uri,null,DeploymentOptions.ForceApplicationShutton);
返回true;
}
捕获(例外e)
{
//记录异常,或执行其他操作,由您决定
返回false;
}
}
由于UpdatePackageAsync在有任何东西阻止它下载更新时会引发异常,所以上面的尝试就在这里。这可能是由许多原因造成的(例如,更新已安装、证书不正确等),这就是为什么在运行更新之前,您可能希望首先在当前软件包上使用CheckUpdateAvailabilityAsync()

无论如何,希望这将证明对任何其他遇到这种情况的人都有用,而且微软还没有发布覆盖传统应用程序快捷方式的Windows更新