GAC中的库被多个应用程序使用,它是不是共享相同的对象?

Posted

技术标签:

【中文标题】GAC中的库被多个应用程序使用,它是不是共享相同的对象?【英文标题】:Library in the GAC used by multiple applications, does it share the same objects or not?GAC中的库被多个应用程序使用,它是否共享相同的对象? 【发布时间】:2016-03-15 18:06:24 【问题描述】:

我在多个问题中都看到了这一点,但很多接受的答案都是矛盾的。

有人说,如果您想跨应用程序和域使用对象的单个实例(实际上只是一个同步实例),则只能使用 IPC。

其他人说,在 GAC 的程序集中使用单例模式将导致数据被共享,因为如果 DLL 已被另一个程序集加载(假设 lib 具有单例模式),GAC 将共享一个实例。

有人帮我解决这个问题,我需要在多个线程中的多个应用程序之间共享一个全局对象,并且在我深入了解它之前需要知道它是否可能在没有 IPC(如 WCF)的情况下实现。我更喜欢使用 GAC,因为无论如何我的库更像是一个框架,将由我和其他 3rd 方开发人员开发的一套应用程序使用。此外,速度是一个主要问题,序列化/反序列化对象以不断同步它可能会增加太多延迟,宁愿它是从多个位置引用的单个实例。

【问题讨论】:

【参考方案1】:

不,应用程序的每个实例都将其自己的内存用于所有加载的程序集。甚至可以在一个应用程序中分离两个单例实例(通过使用AppDomains)

单例模式可用于跨汇编,但这将始终位于一个 AppDomain 中。

所以两个应用程序不共享内存/对象实例。

这是所需的行为,因为您不希望其他应用程序访问您的 Thread/Dispatcher/AppDomain(并在您的应用程序中加载自定义程序集)/应用程序类实例


如果您需要在应用程序之间“共享”内存或对象,则需要序列化数据并通过诸如通信层之类的东西“传输”它们。

例如:

TCP/IP “共享”内存(命名管道) 文件

【讨论】:

所以跟进问题,保持快速变化的数据集(每秒数百次变化)在应用程序之间同步,延迟最小甚至没有,最好的方法是什么?它们似乎都涉及某种具有自身延迟的序列化/反序列化。 “每秒数百次更改” 如果数据不稳定,您应该只发送几个。 UDP 主要用于易失性数据。 (如游戏中的位置)。如果数据不是易失性的,您可能不需要“每秒数百次更改”。你能“预测”下一个值吗? (像一个移动的物体) 它与硬件输入有关,因此波动性是必要的,因为数据源是不稳定的。 另外,如果我要为任何启动引用程序集以在我的主库线程下关闭并重新启动的应用程序编写使用互斥锁和命名管道的方法,这是否会被视为同一个应用程序域如此分享? 阅读 COM 对象,这可能是要走的路,因为它建议直接访问对象,我认为这意味着没有序列化/反序列化,因此是我最快的选择。

以上是关于GAC中的库被多个应用程序使用,它是不是共享相同的对象?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 共享库被加载两次

FxCop 和 GAC 疯狂

将 DLL 安装到全局程序集缓存(GAC)

tomcat: 类加载器

如何在多个进程之间共享缓存?

两个或多个 Drupal 视图页面显示是不是可以共享相同的路径?