Я думаю, что все, что вы видите, это дизайн.
Как только вы позвоните 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}\
Вы увидите 3 суб-клавиши для каждого установленного вами приложения clickonce.
В моем случае приложение называется WindowsApplication, а токен открытого ключа - 619d47505395849. Поэтому важный ключ для поиска начинается с wind..tion_a619d47505395849_
![enter image description here](https://i.stack.imgur.com/PQ4sr.png)
На вашей стороне должно быть что-то похожее на test..tion_7613da056444d824_xxxxxxxxxx . Просто переберите ключи, найдите токен открытого ключа и выберите самый короткий ключ.
Теперь важная часть. Посмотрите на значение, имя которого заканчивается на !PendingDeployment
. После вызова метода CheckForDetailedUpdate
он должен выглядеть следующим образом:
![enter image description here](https://i.stack.imgur.com/X79hW.png)
Вот почему появляется диалог обновления.
А затем просто замените значение на это, и все готово:
![enter image description here](https://i.stack.imgur.com/G4b83.png)
Диалог обновления больше не будет отображаться. Пользователь может вручную проверить наличие обновлений в вашем приложении, принять или игнорировать его снова и снова.
Вы можете проверить эти шаги вручную, чтобы увидеть, все ли работает как положено. Помещение в коде должно выглядеть примерно так:
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;
}
UPDATE
Другой обходной путь:
Вместо вызова встроенной функции 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;
}
Он будет сравнивать развернутую на данный момент версию с последней версией в файле манифеста и возвращает экземпляр CustomUpdateCheckInfo
:
public class CustomUpdateCheckInfo
{
public bool IsUpdateAvailable { get; set; }
public string NewestVersion { get; set; }
}