RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 755140
Accepted
LukavskyM
LukavskyM
Asked:2020-12-07 21:00:02 +0000 UTC2020-12-07 21:00:02 +0000 UTC 2020-12-07 21:00:02 +0000 UTC

如何正确添加 ClickOnce 应用程序以启动?

  • 772

您必须获取使用 ClickOnce 安装的应用程序快捷方式的路径,该快捷方式在Environment.GetFolderPath(Environment.SpecialFolder.Programs)\PublisherName目录中创建,或者以编程方式创建。我发现的所有东西要么不起作用,要么不适合。

UPD:有什么意义。使用 ClickOnce 安装时,您的应用程序将启动,您进行设置,退出应用程序,重新启动 - 一切正常,设置在那里。您以编程方式获取Application.StartupPath,将此路径放入注册表中的自动运行或在启动中创建快捷方式,但是当您打开 PC 时没有设置时会出现惨败,一切都是默认的,需要重新配置。通过从指定Application.StartupPath的快捷方式启动应用程序,我们可以获得与从 ClickOnce 安装程序创建的快捷方式启动应用程序所指定的应用程序设置不同的应用程序设置。如何!

c#
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    rdorn
    2020-12-13T06:25:31Z2020-12-13T06:25:31Z

    对于 clickonce 应用程序和大多数应用程序来说,最不幸的想法是将配置文件存储在可执行文件旁边。如果可以在发布构建阶段进行必要的设置并且仅在紧急情况下进行更改,这是完全可以接受的,但是如果用户可以随意更改它们,最好将它们移动到单独的固定位置,独立于位置的可执行文件。

    另外,clickonce 更新机制的构建方式是,如果您的配置文件在更新版本中较新,则可以在更新期间覆盖您的配置文件,对于上次修改日期的文本文件。这种行为的原因很简单,在更新的应用程序的配置中可能会有额外的参数,没有这些参数将无法正常工作,因此最简单的方法是用新配置覆盖旧配置。

    最可悲的是,可以在项目属性中配置或显式添加的 app.config 或 Settings 等标准工具涉及在可执行文件旁边存储具有默认设置的文件。当然,您可以将缺少的内容添加到生成的类中,它会按您的意愿工作,但默认情况下实现是最小的,MSDN 上的描述相当微薄,尽管如果您真的想,您可以弄清楚在 Settins 对象的参数中写入什么以及在何处写入,以便它开始的行为至少有点有意义(此外,MS 自己最终放弃了这个想法,并且默认情况下提供了一个更轻量级且易于理解的 app.config)。

    总之,您需要确保您的应用程序在配置后不会在更新期间丢失设置。重新安装等 常规工具不允许这样做,这意味着您必须编写自己的管理器(好吧,或者完成 MS 的设置空白)。但是,如果您或客户偏执,您可以选择方便的存储设置格式,至少是加密的二进制文件。

    有两个可能的位置来存储配置:Windows 注册表(CurrentUser 配置单元,因此不需要管理员权限)和%APPDATA%. 在这两种情况下,操作逻辑大致相同,针对读取/写入设置值的方法进行了调整:

    • 我们检查文件夹%APPDATA%\<AppName>\或所需注册表项的存在。

    • 检查文件夹中是否存在必要的配置文件、注册表项中的键。

    • (可选)检查配置版本。

    • 如果找到必要的文件/注册表项并且版本合适,请加载设置并照常工作。

    • 如果版本不适合,我们从默认设置中读取必要的内容,如有必要,我们要求用户澄清参数。

    • 如果找不到文件/注册表项,请创建一个文件夹和文件,为用户运行配置器,或者简单地从默认设置开始。

    正如你所看到的,在这个方案中没有提到“第一次”和“后续”发射。根本没有必要这样做。即使由于某些其他原因意外删除和/或强制重新安装应用程序,这种方法也不允许您丢失设置(如果有足够的毅力,您也可能会抵制重新安装操作系统,但这是一个单独的问题) .

    这种方法的另一个优点是,该文件夹以及 clickonce 应用程序所在的最终文件夹位于用户配置文件中,这意味着该应用程序和设置将可供任何机器上的用户使用,如果您有域,域中的一台机器,并且该域配置了漫游用户配置文件。

    如何准确读取和保存设置取决于您选择的格式。在最简单的情况下,您可以简单地将具有默认设置的 *.config 文件从包含可执行文件的文件夹复制到新位置并在那里进行更改。

    有关 clickonce 应用程序当前安装的更多信息,请使用ApplicationDeployment类。一般来说,如果您决定使用 clickonce,您应该阅读更多有关其功能的信息。

    Environment.GetFolderPath(Environment.SpecialFolder.Programs)\PublisherName\AppName\AppName.appref-ms以任何方便的方式添加指向应用程序的链接以自动运行。使用上述存储设置的方法,您描述的问题将不会出现,因为它们不再与应用程序启动点相关联。


    这种用于存储配置的方案非常适用于经典安装模型、自写更新程序/安装程序,当然还有 clickonce 应用程序。具体来说,clickonce 对我来说是最新的,过渡不需要任何更改。

    • 3
  2. User Cybermerlin
    2020-12-07T21:10:22Z2020-12-07T21:10:22Z

    是在第一次启动时自行创建的,但在设置中您可以指定放置应用程序的路径

    • 1
  3. Lunar Whisper
    2020-12-14T02:36:54Z2020-12-14T02:36:54Z

    您在启动时错误地注册了应用程序。不得通过 .exe 文件启动 ClickOnce 应用程序

    要运行应用程序,请使用

    // Узел реестра, в котором хранятся автозапускаемые приложения
    using (RegistryKey rkApp = Registry.CurrentUser.OpenSubKey(@"\Microsoft\Windows\CurrentVersion\Run", true))
    {
        // Путь к ярлыку вашего приложения
        string startPath;
    
        startPath = GetApplicationPath("YourPublisher", "YourSuite", "YourProduct");
        startPath = GetApplicationPath("YourSuite", "YourProduct");
        startPath = GetApplicationPath("YourProduct");
    
        rkApp.SetValue("YourProduct", startPath);
    }
    
    private static String GetApplicationPath(String yourPublisher, String yourSuite, String yourProduct)
    {
        return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), yourPublisher, yourSuite, yourProduct) + ".appref-ms";
    }
    
    private static String GetApplicationPath(String yourSuite, String yourProduct)
    {
        foreach (String publisherPath in Directory.EnumerateDirectories(Environment.GetFolderPath(Environment.SpecialFolder.Programs)))
        {
            String applicationPath = Path.Combine(publisherPath, yourSuite, yourProduct) + ".appref-ms";
            if (File.Exists(applicationPath))
                return applicationPath;
        }
    
        throw new FileNotFoundException();
    }
    
    private static String GetApplicationPath(String yourProduct)
    {
        return Directory.EnumerateFiles(Environment.GetFolderPath(Environment.SpecialFolder.Programs), yourProduct + ".appref-ms").First();
    }
    

    这是网站英文版的略微修改的解决方案。

    让我解释一下 - ClickOnce 应用程序,由于可能部署在网络上,所以使用的不是程序的当前目录,而是System.Deployment.Application.ApplicationDeployment.CurrentDeployment.DataDirectory. 通过快捷方式启动时,它会被初始化。通过 .exe 启动时 - 不。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5