我想从远程服务器更新我的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()方法。

帮助程序可执行文件

这个想法是使用某种更新整理器。您的主应用程序保持不变,您只添加了一点代码,以便您的应用程序将下载更新,将其放入临时文件夹,然后您的主应用程序开始更新Finisher(在单独的过程中 )和退出。更新Finisher等待直到您的应用关闭,然后将新文件从临时文件夹复制到您的App文件夹中替换所有文件。 Update Finisher无法替换它自己的可执行文件,但它可以在启动更新整理器之前由主应用程序完成。复制文件后,Update Finisher运行您的应用程序。

p.s。个人我更喜欢以前的解决方案,因为它涉及某些voodoo魔法使用App域,反射,装配e.t.c.。如果您需要(例如通过 mef framework )。但后者更容易理解,特别是如果你从未使用过应用域和手动组件加载则,它非常简单。

你可以使用 clickonce (基于您的评论你会准备好进一步的大会得到exe ......因为所提到的另一个海报你不能替换运行的装配)。您可以将其配置为在新版本的不同时间(例如,启动),并自动下载它们。它是一个非常强大的解决方案,你可以用部署组件做很多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top