gpt4 book ai didi

visual-studio-2017 - ClickOnce 手动更新仍然要求更新

转载 作者:行者123 更新时间:2023-12-04 15:06:16 35 4
gpt4 key购买 nike

我通过取消选中发布属性 The application should check for updates 禁用了 Visual Studio 中的更新检查.

我的应用程序检查更新,用户必须选择拒绝更新。

问题是当用户跳过更新时,下次他启动应用程序时,默认的 ClickOnce 更新屏幕会再次出现。

如何确保它永远不会显示默认的 ClickOnce 更新对话框?

我的更新代码:

private void CheckForUpdates()
{
if (!ApplicationDeployment.IsNetworkDeployed)
{
return;
}

var currentDeployment = ApplicationDeployment.CurrentDeployment;

UpdateCheckInfo info;
try
{
info = currentDeployment.CheckForDetailedUpdate();
}
catch (Exception e)
{
return;
}

if (!info.UpdateAvailable)
{
return;
}

var changelogDialog = new Changelog();
if (changelogDialog.ShowDialog() != true)
{
return;
}

currentDeployment.Update();

Exit();
}

这是我的 list :

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
<assemblyIdentity name="test.ccpl.Desktop.application" version="1.0.0.89" publicKeyToken="7613da056444d824" language="en-CA" processorArchitecture="x86" xmlns="urn:schemas-microsoft-com:asm.v1" />
<description asmv2:publisher="test ccpl" co.v1:suiteName="test" asmv2:product="test ccpl" xmlns="urn:schemas-microsoft-com:asm.v1" />
<deployment install="true" mapFileExtensions="true" co.v1:createDesktopShortcut="true">
<deploymentProvider codebase="https://test-test.test.ca/Installers/test.ccpl.Desktop.application" />
</deployment>
<dependency>
<dependentAssembly dependencyType="install" codebase="Application Files\test.ccpl.Desktop_1_0_0_89\test.ccpl.Desktop.exe.manifest" size="58997">
<assemblyIdentity name="test.ccpl.Desktop.exe" version="1.0.0.89" publicKeyToken="7613da056444d824" language="en-CA" processorArchitecture="x86" type="win32" />
<hash>
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<dsig:DigestValue>u36JKY4n1mmu2LZC3Ea5uRLheiM=</dsig:DigestValue>
</hash>
</dependentAssembly>
</dependency>
<compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
<framework targetVersion="4.7.2" profile="Full" supportedRuntime="4.0.30319" />
</compatibleFrameworks>
<publisherIdentity ...>

最佳答案

我认为你所看到的一切都是设计使然。
只要您调用currentDeployment.CheckForDetailedUpdate() ,clickonce 会将更新元数据存储在注册表中。下次启动时,clickonce 将始终查看此信息以查看是否有待处理的部署,如果有,它还将确定用户是否跳过了此较新版本。如果您愿意,这是设计使然。
但是,如果您真的想在启动时摆脱 clickonce 更新对话框,那么有一个丑陋的解决方案可用:-) 更新:有关第二种解决方法,请参见下文。
首先,让我们看一下注册表以及一切是如何工作的:

  • 导航到此位置:HKEY_CURRENT_USER\Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0\PackageMetadata\{2ec93463-b0c3-45e1-8364-327e96aea856}_{3f471841-eef2-47d6-89c0-d028f03a4ad5}\
  • 您将看到已安装的每个 clickonce 应用程序的 3 个子键。
    在我的例子中,应用程序被称为 WindowsApplication,公钥 token 是 a619d47505395849。所以要寻找的重要关键字从 wind..tion_a619d47505395849_ 开始。
    enter image description here
  • 您应该会看到类似于 的内容测试..tion_7613da056444d824_xxxxxxxxxx 在你身边。只需遍历 key ,查找公钥 token 并选择最短的 key 。
  • 现在是重要的部分。查看名称以 !PendingDeployment 结尾的值.调用CheckForDetailedUpdate后方法,它应该如下所示:
    enter image description here
    enter image description here
    这就是显示更新对话框的原因。
  • 然后用这个替换值,你就完成了:
    enter image description here
  • 更新对话框将不再出现。用户可以手动检查您的应用程序中的更新,一次又一次地接受或忽略它。

  • 您可以手动测试这些步骤以查看一切是否按预期工作。将其放入代码中应该类似于以下内容:
        var changelogDialog = new Changelog();
    if (changelogDialog.ShowDialog() != true)
    {
    RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0\PackageMetadata\{2ec93463-b0c3-45e1-8364-327e96aea856}_{3f471841-eef2-47d6-89c0-d028f03a4ad5}");
    var subkeyName = key.GetSubKeyNames().Where(x => x.Contains("7613da056444d824")).OrderBy(x => x.Length).First();
    var subkey = key.OpenSubKey(subkeyName, true);
    subkey.SetValue("{2ad613da-6fdb-4671-af9e-18ab2e4df4d8}!PendingDeployment", new byte[] { 00, 00 }, RegistryValueKind.Binary);

    return;
    }
    更新
    另一种解决方法:
    而不是调用内置函数 CheckForDetailedUpdate() ,您可以创建自己的“CheckForUpdate”方法。这没什么大不了的:
    private CustomUpdateCheckInfo CheckForUpdate()
    {
    var info = new CustomUpdateCheckInfo();

    var currentVersion = ApplicationDeployment.CurrentDeployment.CurrentVersion;
    var manifestUri = ApplicationDeployment.CurrentDeployment.UpdateLocation;

    using (XmlTextReader reader = new XmlTextReader(manifestUri.AbsoluteUri))
    {
    var doc = XDocument.Load(reader);
    var version = doc.Descendants().FirstOrDefault(n => n.Name.LocalName == "assemblyIdentity").Attribute("version").Value;

    info.NewestVersion = version;
    info.IsUpdateAvailable = currentVersion.ToString() != version;
    }

    return info;
    }
    它将当前部署的版本与 list 文件中的最新版本进行比较,并返回 CustomUpdateCheckInfo 的实例:
    public class CustomUpdateCheckInfo
    {
    public bool IsUpdateAvailable { get; set; }
    public string NewestVersion { get; set; }
    }

    关于visual-studio-2017 - ClickOnce 手动更新仍然要求更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54204485/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com