如何从远程主机更新exe-C#4.0-WPF应用程序
-
29-10-2019 - |
题
我想从远程服务器更新我的exe。因此,当按钮点击我的WPF应用程序时,它将下载远程和远程TXT文件并将当前的文件替换为exe运行的同一文件夹中。因此,当我的Exe运行时,它将覆盖当前的TXT和EXE文件。我怎么能这呢?
远程主机是属于www.mydomain.com/MyAPP.exe
的URL
WPF应用程序,C#4.0
解决方案
我们解决此问题的方法是创建一个Shell exe,该exe是最初安装并部署到客户端计算机的exe。
“实际”可执行程序存储在此初始应用程序的子目录中。启动Shell应用程序后,在下载并安装了真实应用程序的任何更新后,它将在单独的AppDomain中启动真实应用程序的可执行文件。
这是从外壳应用程序内部启动的“真实”应用程序的核心: 通用标签
请注意,在我们的版本中,shell应用程序会从用户那里收集用户名和密码,以便正确访问更新网站。然后,这些数据通过AppDomain上的SetData
方法传递给“真实”应用。
其他提示
解决方案取决于您的特定情况。但没有直接解决方案,因为在将它们加载到内存并使用时,无法更新程序集。我可以提出2个解决方案:使用影子复制并使用某种帮助程序可执行。我已经用过它们。
暗影复制。
显而易见的方法是让您的主要可执行文件复制,在您的应用程序运行时更换它,然后重新启动应用程序。但是你不能让你的默认app域要复制影子,只有辅助应用程序域可以。但是,您仍然可以将所有代码移动到另一个装配(例如,mainapplib.dll)并重写您的主应用程序可执行文件(mainapp.exe),以便它仅包含“加载器代码”。此加载程序代码必须创建另一个应用程序域,将其设置为复制的影子,然后在辅助应用程序域中运行程序逻辑。请注意不要将主应用程序域中的任何直接引用到MainApplib.dll,因为那么此程序集将被加载到您的主应用程序域中,而不是复制的影子,并且程序集会被锁定。在大多数情况下,您可以使用 appdomain.executeassembly()方法。
p.s。个人我更喜欢以前的解决方案,因为它涉及某些voodoo魔法使用App域,反射,装配e.t.c.。如果您需要(例如通过 mef framework )。但后者更容易理解,特别是如果你从未使用过应用域和手动组件加载则,它非常简单。
你可以使用 clickonce (基于您的评论你会准备好进一步的大会得到exe ......因为所提到的另一个海报你不能替换运行的装配)。您可以将其配置为在新版本的不同时间(例如,启动),并自动下载它们。它是一个非常强大的解决方案,你可以用部署组件做很多。