我不“得到”程序如何更新自己。如何更新软件?

时间:2009-11-17 12:36:05

标签: c# upgrade patch

假设我创建一个.exe文件,一切都很好。太棒了。

说我开发了一个关于该软件的新功能,我希望它可以用于已经拥有旧版本的人,如何让软件找到我的新版本,修补它,然后开展业务。

我似乎无法解决这个问题。

谢谢。

修改 我很抱歉这个混乱,但我的意思是一个代码更明智的答案。我的代码中是否有一些特殊内容我应该允许更新?

例如,如果我想添加新功能,如何在已打包的.exe中添加“方法”? :S让我有一个旋转。

9 个答案:

答案 0 :(得分:17)

一种流行的解决方案是实际上有一个单独的过程替换必要的文件。

您是否注意到Firefox必须在每次更新时重新启动?好吧,那是因为一个单独的进程(updater.exe)正在下载文件,关闭firefox,替换文件,然后再次启动firefox。

编辑当然这假设您在线托管更新程序可以检查的更新列表(RSS源,甚至是简单的文本文件)。

答案 1 :(得分:15)

您需要查看Click Once Deployment

  

ClickOnce是一种部署技术,使您能够创建自我更新的基于Windows的应用程序,这些应用程序可以在最少的用户交互下安装和运行。如果您使用Visual Basic和Visual C#开发了项目,Visual Studio将为使用ClickOnce技术部署的应用程序的发布和更新提供全面支持。

这会创建一个可下载的安装程序exe,您可以将其加载到Web上。用户要么就地运行它,要么下载并运行它。这会将您的exe包装在代码中,该代码将检查Web位置(以您选择的频率)进行更新。如果找到一个,它将为用户安装它。

您无需对代码进行任何特殊更改即可启用此功能。超出增加版本号。只需像平常一样修改和扩展代码,编译,构建,打包和上传。

需要注意的一点是,ClickOnce不支持安装需要管理员权限的应用程序:

  

ClickOnce部署使非管理员用户只能安装和授予应用程序所需的代码访问安全权限。

因此,如果您的应用程序需要管理员级别的访问权限才能运行甚至安装,那么它就不是您的解决方案。

答案 2 :(得分:14)

通常情况如下:

  • 用户启动应用程序
  • 应用程序启动“更新程序”(另一个程序)
  • 如果存在更新的版本,更新程序将从Internet检索
  • 如果是这种情况,建议用户更新
  • 用户接受,更新程序下载新安装包(可以是增量安装)
  • 更新程序关闭应用程序(或更好,要求用户执行此操作)并启动新安装程序。
  • 安装包完成剩下的工作

当然,你可以有很多变化,但这是实现它的基本方法。

在Windows上,至少有些软件会安装一个始终打开的更新程序守护程序,并检查它所需的软件的新更新(例如,GoogleUpdater)。

答案 3 :(得分:6)

一个想法 - 你可以有一个加载器应用程序为你做检查,然后如果有必要在启动之前更新主应用程序的exe文件?

答案 4 :(得分:1)

对于Windows(通常是因为Windows在执行时锁定了.exe文件)

  • 软件确定需要更新
  • 软件运行打包的更新可执行文件(此时软件退出)
  • 更新将所需文件下载到某个临时文件夹
  • 更新应用修补程序
  • 更新重启软件

答案 5 :(得分:1)

嗯,通常的方法是您的应用程序定期检查(通常在Internet上)新版本。这可能是每次启动或每周一次或其他任何事情。

在那里你可以简单地举一个包含当前版本号的文本文件。如果那个比安装的应用程序的版本更新,您可以下载更新程序(不要忘记签名并检查签名)并安装新版本。

答案 6 :(得分:1)

让您的应用偶尔通过网络向您的网络服务器发出请求。请求返回包含版本号的文件以及指向最新版安装程序的链接。如果该版本号大于当前运行程序认为的版本号,请让程序下载新的安装文件并启动它。

答案 7 :(得分:1)

您不会修改当前的.exe。

您启动一个单独的进程,下载该文件的新版本。新版本取代旧版本。无需修改。

答案 8 :(得分:0)

从代码的角度来看,我喜欢采用一种名为IRun的简单接口和另一种名为IUpdated的接口:

public interface IRun()
{
  public void Run();
}

public interface IUpdated()
{
  public void Update();
}

现在我的主应用程序将只使用反射加载和“运行”库,反过来启动实际应用程序。

主应用程序可执行文件将执行以下步骤:

  1. 阅读updater.cfg,连接到提供的位置并检查更新程序的更新
  2. 如果有更新,请下载更新的dlls和updater.cfg
  3. 使用反射加载updater.dll并启动Update()方法。
  4. 更新方法执行与实际应用程序更新相同的步骤。

    最后

    1. 加载“core.dll”并启动Run()方法。
    2. 当然,如果你想“自己动手”,ClickOnce实际上也是一个非常好的方法,可能更好,但是你可以减少控制。主要的应用程序可执行文件非常简单,可以避免不得不自行更新或应该更新。