【发布时间】:2013-10-09 16:18:29
【问题描述】:
是否也可以使用多个 AppDomain 来隔离非托管 dll 中的内存? 只是为了澄清一下,如果我有一个使用一些内部静态全局变量的非托管 dll,如果我在不同的应用程序域中加载该非托管 dll 会发生什么?我可以安全地假设 dll 将在不同的地址空间中加载,因此它们拥有自己的共享数据副本吗?
【问题讨论】:
是否也可以使用多个 AppDomain 来隔离非托管 dll 中的内存? 只是为了澄清一下,如果我有一个使用一些内部静态全局变量的非托管 dll,如果我在不同的应用程序域中加载该非托管 dll 会发生什么?我可以安全地假设 dll 将在不同的地址空间中加载,因此它们拥有自己的共享数据副本吗?
【问题讨论】:
不,这是不可能的。 AppDomain 是纯托管的概念。非托管 DLL 状态是进程范围的,并且只能加载一份 DLL 副本。一种可能的技巧是创建具有不同名称的 DLL 文件的副本。然而,它的扩展性很差,而且 pinvoke 很讨厌,必须编写委托并使用 LoadLibrary + GetProcAddress 来绑定它们。
更简洁的替代方法是使用单独的帮助程序来加载 DLL。使用 WCF 等互操作机制与他们交谈。
【讨论】: