<分区>
最近我参加了 .NET 职位的面试。在被问到的问题中,我很难回答一个问题。我希望有人可以帮助我。
场景(问题):应用程序的第一个版本(可能是 winform/wpf UI 应用程序)已经发布给客户,他们开始使用该应用程序。但不幸的是,QA 团队后来在当前版本中发现了一个严重的问题。现在的挑战是,我们应该能够在不强制应用程序重新启动的情况下发送和应用补丁(修复)。假设该应用程序是一个实时应用程序,无法重新启动以应用补丁。
就我个人而言,我很难给出一个令人信服的答案,这个答案在应用补丁时不影响正在运行的应用程序。
回答:
感谢您迄今为止所做的所有贡献。我已经设法解决了这个问题。不知道是不是面试官问的。尽管如此,我还是很高兴阅读有关 Microsoft 的 ClickOnce 的信息,它几乎可以满足我的要求。
对于当前运行的可执行文件,您几乎陷入困境 - 您无法明智地修改内存中运行的进程。
但是,从 DLL 加载的东西要灵活得多。程序集可以在运行时动态加载,并且可以在单个应用程序中启动多个 AppDomain。一种解决方案可能是沿着这些思路:
- 您的可执行文件是一个将所有功能传递给 DLL 的瘦包装器
- 您的 DLL 功能通过单独的 AppDomain 加载和运行
- 当需要补丁时,复制新的 DLL(与现有的并排)
- 自动或响应用户交互,一个新的 AppDomain 与现有 AppDomain 一起启动,运行新补丁
- 在应用程序中的适当位置(例如,全屏切换或定时刷新),新的 AppDomain 成为“实时”应用程序域
- 旧的 AppDomain 被关闭并丢弃
但是,这是非常高级的。在现实情况下,您很可能会拥有一个包含缓存和实时数据以及许多其他考虑因素的多层应用程序。例如,可能有必要将应用程序的前端逻辑与缓存或数据处理部分分开,以便可以切换任何一个部分而不会影响其余部分。
某些不常见的技术在这里可能会有用,具体取决于具体要求。高级缓存可以允许在前端不失去显示数据的能力的情况下换出数据层。命令队列或可靠的消息传递机制可以允许 UI 在业务层被换出时保持响应,然后新的业务层可以处理队列。如果您假设一个(逻辑上)基于服务器的应用程序,那么每一层的冗余可以允许更新一个层的一个冗余“服务器”,而另一个服务器继续处理......等等。