【问题标题】:ClickOnce CheckForUpdate() returns null after a whileClickOnce CheckForUpdate() 一段时间后返回 null
【发布时间】:2023-03-24 13:36:01
【问题描述】:

我的 ClickOnce 应用程序有问题,当我调用 CheckForUpdate() 一段时间后它可以正常工作,并且我的重启系统工作正常。大约一小时后,它开始崩溃。我在一个单独的线程上运行它,并且 ClickOnce 应用程序在我们的本地网络上。

错误代码:

System.Deployment.Application.DeploymentException:已使用不同的应用程序标识安装了此部署的应用程序。在 System.Deployment.Application.SubscriptionStore.CheckAndReferenceApplication(SubscriptionState subState,DefinitionAppId appId,Int64 transactionId) 在 System.Deployment.Application.DeploymentManager.BindCore(布尔阻塞、TempFile& tempDeploy、TempDirectory& tempAppDir、FileStream& refTransaction、String& productName) 在 System.Deployment.Application.DeploymentManager.Bind() 在 System.Deployment.Application.ApplicationDeployment.CheckForDetailedUpdate(布尔型 persistUpdateCheckResult) 在 System.Deployment.Application.ApplicationDeployment.CheckForUpdate()

方法如下:

private void RestartUpdate()
{
    bool running = true;
    while (running)
    {
        Thread.Sleep(5000);
        try
        {
            if (!RESTARTING)
            {
                if (ApplicationDeployment.IsNetworkDeployed)
                {
                    ApplicationDeployment updateCheck = ApplicationDeployment.CurrentDeployment;
                    bool newUpdate = updateCheck.CheckForUpdate(); **<---- Problem**
                    if (newUpdate == true)
                    {
                        RESTARTING = true;
                        updateCheck.UpdateCompleted +=
                        new AsyncCompletedEventHandler(
                        Deployment_UpdateCompleted);
                        updateCheck.UpdateAsync();                               
                    }
                }
            }
        }
        catch (Exception e)
        {
            SendErrorMessageToServer(e.ToString());
        }
    }
}

你知道为什么会这样吗?

编辑:

从 James Miles 那里找到答案,他在检查更新时似乎完全绕过了 click-once 部署 API:

//Used to use the Clickonce API but we've uncovered a pretty serious bug which results in a COMException and the loss of ability
//to check for updates. So until this is fixed, we're resorting to a very lo-fi way of checking for an update.
var manifestFile = new WebClient().DownloadString(updateLocation);
var xdoc = XDocument.Parse(manifestFile);
XNamespace nsSys = "urn:schemas-microsoft-com:asm.v1";
var version = new Version(xdoc.Descendants(nsSys + "assemblyIdentity").First().Attribute("version").Value);

【问题讨论】:

  • 应用程序更新后是否开始崩溃?如果是这样,您必须更改AssemblyInfo中的应用程序版本号

标签: c# multithreading clickonce updates


【解决方案1】:

我选择了绕过OneClick API 的解决方案。

string manifestFile = new WebClient().DownloadString(@"\\*\*.application");
XDocument xdoc = XDocument.Parse(manifestFile);
XNamespace nsSys = "urn:schemas-microsoft-com:asm.v1";
Version versionNew = new Version(xdoc.Descendants(nsSys + "assemblyIdentity").First().Attribute("version").Value);
int result = applicationDeplayment.CurrentVersion.CompareTo(versionNew);
if (result < 0)
{
   applicationDeplayment.UpdateAsync();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多