Возврат версии ClickOnce не работает при запуске приложения при запуске из реестра Windows - PullRequest
0 голосов
/ 17 марта 2011

Я использую следующий код с System.Deployment для возврата версии ClickOnce моего приложения .NET 3.5 C #:

public string version
{
    get
    {
        System.Reflection.Assembly _assemblyInfo = System.Reflection.Assembly.GetExecutingAssembly();
        string ourVersion = string.Empty;

        if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
        {
            ourVersion = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString();
        }
        else
        {
            if (_assemblyInfo != null)
            {
                ourVersion = _assemblyInfo.GetName().Version.ToString();
            }
        }
        return ourVersion;
    }
}

Если я нормально запускаю приложение (например, из меню «Пуск»), это значение всегда возвращается правильно. Однако, если я автоматически запускаю приложение в Windows с помощью ключа реестра, приложение возвращает значение по умолчанию в жестком коде 1.0.0.0.

Если я закрою автоматически запущенное приложение и заново открою его вручную, оно снова вернет правильный номер версии ClickOnce.

Есть идеи, почему это может быть? Вот код, который я использую для установки ключа реестра:

string keyName = "MyApp";
string assemblyLocation = Assembly.GetExecutingAssembly().Location;
Util.SetAutoStart(keyName, assemblyLocation);

И

public class Util
{
    private const string RUN_LOCATION = @"Software\Microsoft\Windows\CurrentVersion\Run";

    /// <summary>
    /// Sets the autostart value for the assembly.
    /// </summary>
    /// <param name="keyName">Registry Key Name</param>
    /// <param name="assemblyLocation">Assembly location (e.g. Assembly.GetExecutingAssembly().Location)</param>
    public static void SetAutoStart(string keyName, string assemblyLocation)
    {
        RegistryKey key = Registry.CurrentUser.CreateSubKey(RUN_LOCATION);
        key.SetValue(keyName, assemblyLocation);
    }

    /// <summary>
    /// Returns whether auto start is enabled.
    /// </summary>
    /// <param name="keyName">Registry Key Name</param>
    /// <param name="assemblyLocation">Assembly location (e.g. Assembly.GetExecutingAssembly().Location)</param>
    public static bool IsAutoStartEnabled(string keyName, string assemblyLocation)
    {
        RegistryKey key = Registry.CurrentUser.OpenSubKey(RUN_LOCATION);
        if (key == null)
            return false;

        string value = (string)key.GetValue(keyName);
        if (value == null)
            return false;

        return (value == assemblyLocation);
    }

    /// <summary>
    /// Unsets the autostart value for the assembly.
    /// </summary>
    /// <param name="keyName">Registry Key Name</param>
    public static void UnSetAutoStart(string keyName)
    {
        RegistryKey key = Registry.CurrentUser.CreateSubKey(RUN_LOCATION);
        key.DeleteValue(keyName);
    }
}

1 Ответ

2 голосов
/ 17 марта 2011

Я выделил проблему.Я не буду притворяться, что понимаю в точности , как работает ClickOnce, но, по сути, если вы запустите исполняемый файл напрямую, он не будет работать в «режиме ClickOnce».Это означает, что он не будет проверять наличие обновлений и не получит правильный номер версии (поскольку он фактически не развернут по сети).

Лучшее решение, которое я нашел на данный момент, - указать ClickOnceФайл .appref-ms, а не файл .exe.Этот файл похож на ярлык своего рода и находится в меню «Пуск».

Вот код, который я использую для получения местоположения файла .appref-ms моего приложения:

string allProgramsPath = Environment.GetFolderPath(Environment.SpecialFolder.Programs);
string shortcutPath = Path.Combine(allProgramsPath, keyName);
shortcutPath = Path.Combine(shortcutPath, keyName) + ".appref-ms";

И затем я комбинирую это с моим предыдущим кодом, чтобы установить это местоположение в реестре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...