【问题标题】:Component based architecture: Replacing an assembly at runtime基于组件的体系结构:在运行时替换程序集
【发布时间】:2011-11-25 03:25:52
【问题描述】:

在运行时替换程序集是个好主意吗? 我会遇到什么问题?

原问题:StructureMap - Ability to replace an assembly at runtime

在 Web 应用程序和非 Web 应用程序中在运行时替换程序集有什么区别?

【问题讨论】:

  • 最明显的问题是性能
  • @GertAnrold 你错了。我已经使用 Web 应用程序完成了这项工作。看看codecampserver.codeplex.com 网站。
  • @MohamedAbed 你会这么好,给我更多细节吗?
  • 为了让任何框架、IoC 容器或手动代码支持在运行时替换程序集,可以: - 将这些程序集分别加载到单独的应用程序域中,以便能够卸载组装并加载另一个代替(替换)..这将导致性能和内存占用的影响,因为拥有单独的应用程序域具有编组和内存管理的成本。 - 在运行时在 IL 级别(拦截)替换程序集的内容,这也会产生巨大的性能成本。

标签: c# architecture replace assemblies components


【解决方案1】:

不同之处在于 IIS 会在您每次更新 DLL 时创建一个新的卷影副本。因此,当您添加新的 DLL 时,您会自动获得一个新的 AppDomain。

WinForms 等对你没有那么神奇的作用,这就是它不起作用的原因。

【讨论】:

  • 这听起来很有趣。正如 Mohamed Abed 在他的评论中提到的那样,这将导致性能和记忆足迹的影响。那么这是一个相关还是不相关的性能问题?
  • 在使用 IIS 的 Web 应用程序的场景中。第二个问题是:如何在非 Web 应用程序中构建这种“魔法”,我会遇到什么问题?
  • 好吧,你不经常更新 DLL,所以我看不到任何性能损失。恕我直言,客户端应用程序不存在同样的问题。只需在更新 DLL 后重新启动应用程序
  • 如果我不能轻易关闭我的应用程序怎么办,因为它必须每次都运行。所以我仍然想要实现的是在运行时替换一个程序集(dll)。据我了解,应该没有问题。
  • JGauffin 是对的。 IIS 会为您重新启动应用程序,但由于 Web 应用程序是无状态的,因此您大部分时间不会注意到这一点。
【解决方案2】:

如果针对该程序集运行的代码在单独的 AppDomain 中运行,并且您在执行操作之前关闭了 appdomain,则应该没有问题。

【讨论】:

  • 你看过我原来的问题了吗?
  • 现在我做到了,我猜由于您使用的是 ioc,因此您的 IOC 容器“引用”了您显然无法替换的程序集。抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 2011-09-23
相关资源
最近更新 更多