我希望能够使用我的程序进行“inplace”更新。基本上,我希望能够在部署软件的地方远程登录,在其他用户仍在使用它的同时安装它(以瘦客户端方式),并更新他们的程序。
这可能没有太多麻烦吗?我已经研究过clickonce技术,但我认为这不是我真正想要的。
firefox的更新方式怎么样?只需等待您重新启动程序,并在更新时通知您。
更新:我没有远程进入用户的电脑。该程序在服务器上运行,我远程登录并更新它,用户通过远程访问直接在服务器上运行它。
ClickOnce不起作用,因为它需要网络服务器。
答案 0 :(得分:3)
我有一些我现在找不到的示例代码,但您可以使用System.Deployment.Application namespace执行与Firefox类似的操作。
如果你使用ApplicationDeployment class,你应该能够做你想做的事。
从MSDN开始,这个班级......
以编程方式支持当前部署的更新,并处理文件的按需下载。
答案 1 :(得分:3)
考虑使用BITS的MS API,只需在脚本中使用bitsadmin.exe或Windows Update Services。
答案 2 :(得分:2)
有些问题:
如果您无法更改文件的位置,并且每个人都在进行远程处理,并且每个人都在就地执行这些文件,那么您就会遇到问题。只要有1个用户运行程序,文件就会被锁定。您只能在每个人都出去后更新文件。
另一方面,如果用户能够运行他们自己的文件私有副本,那么我会设置一个系统,其中你有一个包含最新版本文件的中央文件夹,当用户启动时他的程序,它检查中央文件夹是否有比用户即将执行更新的版本。如果是,请先复制新版本。
或者,如果这将花费太长时间,用户将变得不耐烦(什么,用户变得不耐烦?),然后让程序在启动后检查版本,并提醒用户退出将工作。在这种情况下,程序会设置一个标志,在下次启动时会进行复制,只有现在用户才知道它正在发生。
复制部件很容易通过具有执行实际复制的单独可执行文件并执行该复制部件来处理,或者程序可以将其自身临时复制到另一个位置并使用“更新原始文件”的参数运行该副本”
答案 3 :(得分:2)
虽然您可以设计代码来修改自身(可能不在C#中?),但这通常是一个坏主意。这意味着您必须重新启动某些内容才能获得更新。 (在Linux中,您可以替换正在使用的文件,但是在将新数据加载到内存中之前不会发生更新,即应用程序重新启动)
Firefox使用的策略(从未实际查看过)将更新的可执行文件存储在另一个文件中,该文件在程序开始加载时进行检查。这允许程序在操作系统锁定资源之前用更新覆盖程序。您还可以设计更模块化的程序,以便可以“重新启动”部分程序,而无需重新启动整个程序。
您实际上如何做到这一点可能是由其他人提供的链接提供的。
编辑::根据对Lasse V. Karlsen的回应
您可以让主程序查找要加载的程序的最新版本(如果没有所有人,该程序将无法获得更新)。然后,一旦人们不再使用旧版本,您就可以删除旧版本。根据人们重新启动程序的频率,您可能会得到许多较旧的程序版本。
答案 4 :(得分:1)
请仔细检查这两种方法并将其添加到您的问题中,解释为什么他们可能无法满足您的需求。否则,很难继续前进,并提出更好的选择。
编辑:对于在浏览器外部运行的Silverlight应用程序,这个“我刚刚更新,请重新启动”的内容似乎是一个方法调用。在这一点上,我很确定这可能是你的选择。
答案 5 :(得分:0)
ClickOnce不需要网络服务器,它允许您在用户运行软件时发布更新。您可以对应用程序进行编码,以便每隔几分钟检查一次新的更新,并提示用户重新启动应用程序,如果找到新版本,则会使用它们完成升级过程。
另一个选项是Silverlight OOB应用程序,但如果您的应用程序已构建为WinForms / WPF客户端应用程序,那么这将更有效。
答案 6 :(得分:0)
Microsoft的智能客户端架构和设计指南中讨论了各种部署/更新方案(针对.NET应用程序)的优缺点。虽然有点旧,但我发现大多数仍然存在,因为它描述的是基本的建筑原理而不是技术细节。有一个PDF版本,但你也可以在网上找到它:
答案 7 :(得分:0)
Is this possible without too much of a hassle?
考虑到瘦客户端的并发性问题以及Windows安装的复杂性,是热门更新将不再像系统所要求的那样进行。