C# 对软件进行就地更新
我希望能够对我的程序进行“就地”更新。基本上,我希望能够远程登录软件部署的位置,在其他用户仍在使用它时安装(以瘦客户端方式),并更新他们的程序 这可能不太麻烦吗?我研究过clickonce技术,但我认为这不是我真正想要的 firefox的更新方式如何?只需等待您重新启动程序,并在更新时通知您C# 对软件进行就地更新,c#,installation,C#,Installation,我希望能够对我的程序进行“就地”更新。基本上,我希望能够远程登录软件部署的位置,在其他用户仍在使用它时安装(以瘦客户端方式),并更新他们的程序 这可能不太麻烦吗?我研究过clickonce技术,但我认为这不是我真正想要的 firefox的更新方式如何?只需等待您重新启动程序,并在更新时通知您 更新:我没有远程进入用户的电脑。此程序在服务器上运行,我远程进入并更新它,用户通过远程访问直接从服务器上运行它 ClickOnce不起作用,因为它需要一个Web服务器。ClickOnce和Silverli
更新:我没有远程进入用户的电脑。此程序在服务器上运行,我远程进入并更新它,用户通过远程访问直接从服务器上运行它 ClickOnce不起作用,因为它需要一个Web服务器。ClickOnce和Silverlight(浏览器外)都支持您的方案,如果我们讨论升级的话。远程登录到您的用户计算机?不。不,据我所知,Firefox也不这么做 请仔细检查这两种方法,并将它们添加到您的问题中,解释为什么它们可能无法满足您的需要。否则就很难继续前进并提出更好的替代方案
编辑:您似乎喜欢的“我刚刚更新,请重新启动”是对在浏览器之外运行的Silverlight应用程序的一个方法调用。在这一点上,我相当确定这可能是您的选择。我有一些示例代码,现在找不到,但您可以使用Firefox做一些类似的事情 如果你使用,你应该能够做你想做的事 从MSDN,这个类 支持以编程方式更新当前部署,并处理文件的按需下载 考虑使用的MS API,仅在脚本或中使用 一些问题:
复制部分可以通过使用单独的可执行文件进行实际复制并执行来轻松处理,或者程序可以将自身临时复制到另一个位置,并使用“更新原始文件”的参数运行该复制。而您可以设计代码来修改自身(可能不是在C#?)中),这通常是一个坏主意。这意味着您必须重新启动某些程序才能获得更新。(在Linux中,您可以替换正在使用的文件,但只有在将新数据加载到内存中(即应用程序重新启动)后才会进行更新) Firefox使用的策略(从未实际查看过)是将更新后的可执行文件存储在另一个文件中,该文件在程序开始加载时进行检查。这允许程序在操作系统锁定资源之前用更新覆盖程序。您还可以将程序设计得更模块化,以便可以对其部分进行修改“重新启动”而不需要重新启动整个程序 你是如何做到这一点的,可能是由其他人提供的链接提供的 编辑::根据对Lasse V.Karlsen的回应
您可以让主程序查找要加载的程序的最新版本(如果没有所有人,此程序将无法获得更新)。当用户不再使用旧版本时,您可以删除它。根据用户重新启动程序的频率,您可能会得到许多旧版本的程序。ClickOnce不需要Web服务器,它允许您在用户运行软件时发布更新。您可以编写应用程序代码以检查新的更新几分钟后,如果发现新版本,则提示用户重新启动应用程序,这将引导他们完成升级过程
另一个选项是Silverlight OOB应用程序,但是如果您的应用程序已经构建为WinForms/WPF客户端应用程序,那么这将需要更多的工作。各种部署/更新场景(针对.NET应用程序)在Microsoft的《智能客户端体系结构和设计指南》中讨论了它们的优点和缺点。虽然有点陈旧,但我发现大多数仍然适用,因为它描述的是基本的体系结构原则,而不是技术细节。有PDF版本,但您也可以在网上找到:
考虑到瘦客户端的并发性问题和Windows安装的复杂性,是的,如果不按照系统要求进行热更新,将是一件麻烦事。这不是一个网站,而是一个winforms应用程序。我不确定这是否真的是ClickOnce的问题。当然,这不包括Silverlight(winforms vs.WPF)。您需要找到一种方法,使新版本可用于已部署的
Is this possible without too much of a hassle?