2016-11-25 3 views
2

У меня проблема с приложением ClickOnce, когда я звоню CheckForUpdate(), пока он работает, и я система перезапуска работает отлично. Примерно через час он начинает сбой. Я запускаю это в отдельном потоке, и приложение ClickOnce находится в нашей локальной сети.ClickOnce CheckForUpdate() возвращает null через некоторое время

Код ошибки:

System.Deployment.Application.DeploymentException: приложение для этого развертывания уже установлено с другим именем приложения. на System.Deployment.Application.SubscriptionStore.CheckAndReferenceApplication (SubscriptionState подсосто DefinitionAppId APPID, Int64 TransactionID) в System.Deployment.Application.DeploymentManager.BindCore (булевой блокировки, TempFile & tempDeploy, TempDirectory & tempAppDir, FileStream & refTransaction, Строка & Productname) на System.Deployment.Application.DeploymentManager.Bind() в System.Deployment.Application.ApplicationDeployment.CheckForDetailedUpdate (Boolean) 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()); 
     } 
    } 
} 

Есть ли у вас какие-либо понятия, почему это происходит?

EDIT:

Обнаружили ответ от Джеймса Майлса, который, кажется, чтобы обойти щелчок однократное развертывания 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); 
+0

Возникли ли сбои после обновления приложения? Если это так, вы должны изменить номер версии приложения в 'AssemblyInfo' – VMAtm

ответ

0

Я пошел за решение, которое обходит 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(); 
}