【问题标题】:ClickOnce or Windows installer for autoupdating a C# application?用于自动更新 C# 应用程序的 ClickOnce 或 Windows 安装程序?
【发布时间】:2012-06-15 21:25:11
【问题描述】:

我应该使用 ClickOnce 还是 Windows 安装程序来自动更新我的应用程序?

我的情况是,我有一个 C# Windows 应用程序正在运行 MySQL 对我通过网络托管服务 (webmasters.com) 维护的数据库的查询。

该程序现在由三个不同的人使用,我只是将发布文件夹复制粘贴到他们的计算机上,并在他们的计算机上安装 MySQL 连接器和.NET framework 4 客户端,然后运行可执行文件 (.exe)。这听起来不太专业,我在想,既然我喜欢与这个项目一起工作,为什么不做一些正确和专业的事情,而不是修补和修复并从我的经验中学习?

所以我想创建一个设置和部署项目,用于将程序安装到其他计算机上。同样在此设置和部署项目中,将包含 mysql 连接器和 .NET 框架,并将与软件一起安装它们。一个安装程序供所有人使用。

此外,我认为程序需要更新服务,这样每次我更改代码中的某些内容时,我就不必跑到人们家来更改程序。所以我创建了一个FTP 站点,我可以在其中上传文件,当程序运行时,它将检查 FTP 站点上的更新,如果上传了任何新文件,它将下载它们并继续使用新版本。我阅读了有关 ClickOnce 应用程序的信息,但我不太了解它是如何工作的。

我已阅读Deploying C# Applications (MSDN),但我应该选择什么来完成这一点并使我的程序更专业,而不仅仅是学生的家庭作业?

【问题讨论】:

  • 我喜欢 xcopy 方式来自动检测网络分片文件夹中的最新版本文件。它更容易实现。例如,您可以将 bat 文件包含到安装项目中,如下所示:@echo off echo COPYING UPDATE。不要关闭此窗口。 xcopy "\\ShardFolder\*.*" "C:\Your WinForm Application\" /s /d /y echo 复制更新完成。开始启动应用程序。不要关闭此窗口。 cd "C:\Your WinForm Application Install Folder" YourWinFormAPP inputParameters exit 然后,在安装项目中创建快捷方式来调用这个bat文件。

标签: c# windows-installer clickonce


【解决方案1】:

需要注意的一点是,ClickOnce 始终安装在当前用户的上下文中。如果他们需要让任何登录到该机器的人都可以使用这个应用程序,那么这个模型将会失败。

使用 Visual Studio 中的安装工具的 MSI 安装程序肯定会为您提供更灵活的安装体验。除了您定义进入应用程序文件夹的内容以及启动文件夹的外观这一事实之外,它还允许自定义安装程序组件。因此,如果您需要让人们安装您的应用程序,但要根据他们的位置输入服务器路径。

您跳过的一个元素是其他安装工具。市场上主要有两种:Wise 和 Install Shield。这些也是很好的工具,我知道您至少可以在 Visual Studio 中构建您的 Install Shield。专业版可以更轻松地合并路径安装程序,从而避免 David Stratton 提到的卸载/安装问题。

【讨论】:

  • +1 用于指出 ClickOnce 的另一个问题并用于扩展专业工具。
【解决方案2】:

完成所有三个操作后,我更喜欢通过拖放 (XCOPY) 部署 Windows 应用程序,这意味着首先手动安装先决条件。

  • ClikOnce 很好 - 直到您需要停用它所托管的服务器,或者证书过期,或者我必须处理的其他一些小问题。除此之外,它是一种非常强大且简单的方法,可以让您的用户的应用程序保持更新。
    • 公平地说,我遇到的所有问题都有答案,并且可以避免它们,但文档并没有告诉您“要避免这种情况,请执行此操作”。对我来说,这一切都是“边走边学”。有一个规划指南来预先解释常见的陷阱会很有帮助。
  • MSI 安装程序也不错,但这意味着要卸载/重新安装才能更新。
  • 拖放 - 简单且不那么华而不实,但如果我想进行小更新,我可以直接复制新文件。

总而言之,所有方法都有优点和缺点,但在我的 95% 的部署中,在公司环境中部署给我们自己的用户,我更喜欢 XCOPY 部署。

如果我要向外部客户交付软件,我会选择使用专业工具构建的安装程序。

也就是说,微软提供了一个good article on choosing between ClickOnce or an MSI Installer。它根本不涉及 XCOPY,但话又说回来,XCOPY 很容易理解,可能没有必要。

【讨论】:

    【解决方案3】:

    如果您可以开源您的代码,那么CodePlex 会为您的安装程序提供 ClickOnce 托管。 ClickOnce Releases 解释了如何设置它。我将它用于my sample project,效果很好。在我发布更新后,所有客户端都会在第一次启动时自动更新。

    【讨论】:

    • 到目前为止我做了什么。我创建了一个 ftp 站点,当我发布我的应用程序时,它会发布在这个位置。当您想运行应用程序时,请使用 ftp 客户端(例如 filezilla)浏览 ftp 站点,然后将应用程序拖放到您的计算机上。现在我想让它自动更新。就像我发布更新版本时,当您运行软件时,它会检查更新版本但不会下载它。它坚持旧版本。我怎样才能成功?
    • 在尝试重新发明现有解决方案之前,我会非常努力地思考。除非你的目标是简单地了解它是如何工作的。
    • 我正在尝试了解 click once 的工作原理。但我没能理解自动更新的工作原理
    最近更新 更多