从 Windows 注册表启动时启动应用程序时,返回 ClickOnce 版本不起作用

2023-12-02

我正在使用以下代码System.Deployment返回我的 .NET 3.5 C# 应用程序的 ClickOnce 版本:

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);

And

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);
    }
}

我已经隔离了这个问题。我不会假装明白exactlyClickOnce 的工作原理,但基本上,如果直接启动可执行文件,它将不会以“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";

然后我将其与之前的代码结合起来,在注册表中设置该位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Windows 注册表启动时启动应用程序时,返回 ClickOnce 版本不起作用 的相关文章

随机推荐

  • 具有多索引的 Pandas 数据透视表小计

    我正在尝试创建一个带有小计 Excel 风格的简单数据透视表 但是我找不到使用 Pandas 的方法 我已经尝试了韦斯在另一个与小计相关的问题中建议的解决方案 但这并没有给出预期的结果 下面是重现它的步骤 创建样本数据 sample dat
  • pdf 小丑 - 不突出显示特定搜索关键字

    我正在使用 pdf clown 和 pdfclown 0 2 0 HEAD jar 我编写了下面的代码来突出显示中文 pdf 文件中的关键字搜索 相同的代码在英文 pdf 文件中工作正常 import java awt Color impo
  • 使用 jQuery 的轮播

    我知道那里有可用的插件 但我正在尝试制作一个自己的插件 但在此之前我试图理解将其制作为无限 圆形轮播的概念 这是我的到目前为止 http jsfiddle net hbk35 KPKyz 3 HTML div ul li div 0 div
  • Div "contenteditable" :获取和删除插入符号之前的单词

    谢谢这个问题和 Tim Down 发布的答案 我做了一个函数来获取 contenteditable div 中插入符号之前的单词 这是一个fiddle 这是函数 function getWordPrecedingCaret containe
  • 从 powershell 为 azure 函数创建函数键

    是否有可能为刚刚从 powershell 脚本创建的 azure 函数创建一个函数键 我有一个发布管道来为 azure 函数创建整个环境 它工作正常 但我缺少的一部分是该函数的自定义函数键 我不想使用默认密钥 我可以在门户中创建新密钥 但我
  • 使用 lambda 函数对 filter() 进行复杂性分析

    给定两个列表 list1 and list2 list3 filter lambda x x in list1 list2 这将返回两个列表的交集 我怎样才能找到这个算法的复杂度 我发现时间复杂度x in list1 is O n 其中 n
  • 理解/mySQL 又名欺骗 Django 中的外键关系

    所以我继承了一些django mySQL 表非常简单 其中父级不是 FK 关系 只是 父级 id CREATE TABLE Child id int 10 unsigned NOT NULL AUTO INCREMENT parent in
  • ASP.NET 中带有和不带有委托的事件

    在一些 ASP NET 示例中 我看到事件与委托一起使用像这样有时没有他们像这样 请解释 所有事件都是委托类型 它们都继承自EventHandler继承自MulticastDelegate其间断自Delegate 有时 或者我宁愿说大多数时
  • 检查 URL 是否转到包含文本“404”的页面

    我有一个 bash 脚本来检查 URL 列表的 HTTP 状态代码 但我意识到有些虽然看起来是 200 但实际上显示包含 错误 404 的页面 我该如何检查呢 这是我当前的脚本 bin bash while read LINE do cur
  • Javascript-firefox:如何从本地 png 文件设置自定义光标?

    如何从本地图像文件为当前页面设置自定义光标 基本上我需要使用 javascript 以编程方式更改为不同的光标 但光标本地存储在我的硬盘驱动器上 你不能 但见下文 因为file 不能从其他协议访问或引用 通过 JavaScript 包含光标
  • 使用 预加载 JSON 文件

    我正在使用 Angular 5 应用程序 并且正在加载相当大的 JSON 文件 问题是加载main需要很长时间 js捆绑 初始化它 引导 Angular 应用程序 稍后获取该 JSON 文件 如果我可以在 Angular 应用程序准备就绪时
  • 如何通过php脚本发送邮件?

    我如何通过php脚本发送邮件 我正在尝试做这样的事情 for k 0 k lt x gt length 1 k for l 0 l lt j 1 l if y gt item k gt nodeValue JobNoArr l Accept
  • c++中的std::string有编码格式吗

    我想找到关于std string的默认编码格式 我想找出编码格式 但我不知道 c 中的std string有编码格式吗 简单的答案 std string定义为std basic string
  • 在 ActionBarActivity 中设置底部的 ActionBar Tab

    你好 我是 Android 菜鸟 我在用appcompat支持库添加选项卡ActionBarActivity 我已经编写了要添加的代码 但选项卡显示在顶部 请在屏幕截图中看到它 我想设置这些Tabs这将出现在底部 知道为什么会这样吗 pri
  • 递归匿名函数 Matlab

    我知道这不是匿名函数的用途 但就像一个谜题一样 我尝试通过匿名函数创建递归函数 递归函数的原型显然就是阶乘函数 问题是很难区分大小写within匿名函数 到目前为止我所做的事情如下 f cn n f eval if n gt 1 f cn
  • VSCode |新窗口选择语言

    我错误地按下了 不要再显示这个 我怎样才能让 vscode 再次显示该选项 有一个设置可以启用 禁用该消息 Workbench gt Editor gt Untitled Hint 通过选择 不再显示 您禁用了该设置 将其设置为hidden
  • C++ 可变参数宏:如何检索参数值

    类中有很多实现类似的方法 只是方法的名称和参数列表不同 void function1 int a bool b mMember gt function1 a b void function2 double a string b mMembe
  • 从谷歌地图获取路线和地图上每2公里的点

    我知道 GPS 坐标我的起点和终点 现在我想知道这次旅行的行车路线 然后获取这条路线上每2公里的GPS坐标 我怎样才能用 php javascript 做到这一点 Thanks 添加的代码
  • html 输出中的特殊字符

    我希望直接打印像 这样的字符 但在源代码中 显示为 248 如果输出通过Html Encode 它不会呈现正确的字符 但是 248 在我的配置中
  • 从 Windows 注册表启动时启动应用程序时,返回 ClickOnce 版本不起作用

    我正在使用以下代码System Deployment返回我的 NET 3 5 C 应用程序的 ClickOnce 版本 public string version get System Reflection Assembly assembl