静态对象/多个应用程序域/一个进程
Posted
技术标签:
【中文标题】静态对象/多个应用程序域/一个进程【英文标题】:static objects / multiple app domains / one process 【发布时间】:2012-06-01 18:16:42 【问题描述】:好的,问题来了,我有一个严重依赖静态变量的 winform 应用程序,它是一个单例应用程序(一次只有一个进程实例)。
我现在需要创建一个包装应用程序,它可以创建 6 个这样的 winform 应用程序并在它们的主窗口之间切换。这样做的原因是这些应用程序有很多静态引用,必须根据它们连接的数据库进行更新。我们的用户现在需要连接到多个数据库,并且重新设计代码以消除静态问题不是一种选择。
所以我的问题是,我知道我可以在一个进程中创建新的应用程序域,但是这些应用程序域中的每一个是否都会获得一组新的静态引用?还是我实际上必须有单独的流程?如果是这样,我该如何构建一个新应用程序来创建旧应用程序的 6 个实例并将数据传递给每个实例(例如隐藏/显示、加载此对象、查询此数据库等...)对于一些简单的事情,这最终会成为一个扔掉的项目。
谢谢!
【问题讨论】:
“我们的用户现在需要 [this]”和“这最终将成为一个丢弃的项目”似乎是矛盾的。 是的,看起来确实如此。他们在这个临时项目中需要它,修复所有静态引用问题所需的时间远远超过了临时收益。在我们的测试阶段完成后,这将全部被丢弃。这确实是我正在寻找的解决方法。 【参考方案1】:每个应用程序域都有自己的一组加载程序集(domain-neutral assemblies 除外,它们在域之间共享)和类型。应用程序域中的每种类型都有自己的静态变量实例(如果是与域无关的程序集,CLR 会以特殊方式提供这一点)。
【讨论】:
不完全正确。程序集可以跨 AppDomain 共享。 CLR 确实为静态添加了一些代码,以隔离 AppDomain 之间的静态,这使得静态变量在涉及多个应用域时会变慢。 @AloisKraus:好的评论,+1。但是,我希望这对于主题启动器来说并不实际。无论如何,我已经更新了答案。以上是关于静态对象/多个应用程序域/一个进程的主要内容,如果未能解决你的问题,请参考以下文章