多个应用程序使用的 GAC 中的库是否共享相同的对象?
Library in the GAC used by multiple applications, does it share the same objects or not?
我在多个问题中都看到过这一点,但是很多被接受的答案都是矛盾的。
有人说,如果要跨应用程序和域使用对象的单个实例(实际上只是同步实例),则只能使用 IPC。
其他人说,在 GAC 中的程序集中使用单例模式会导致数据共享,因为如果 DLL 已被另一个程序集加载(前提是库具有单例模式),GAC 将共享一个实例。
有人帮我解决这个问题,我需要在多个线程中的多个应用程序之间共享一个全局对象,并且在我深入了解它之前需要知道它是否可以在没有 IPC(例如 WCF)的情况下实现。我更愿意使用 GAC,因为我的库更像是一个框架,无论如何,我和其他第 3 方开发人员开发的一套应用程序都会使用它。此外,速度是一个主要问题,serializing/deserializing 一个持续同步的对象可能会增加太多延迟,宁愿它是从多个位置引用的单个实例。
不,应用程序的每个实例都在为所有加载的程序集使用它自己的内存。甚至可以在一个应用程序中分隔两个单例实例 (通过使用 AppDomains)
单例模式可用于交叉汇编,但这将始终在一个 AppDomain 中。
所以两个应用程序不共享 memory/object 个实例。
这是期望的行为,因为您不希望其他应用程序访问您的 Thread/Dispatcher/AppDomain(并在您的应用程序中加载自定义程序集)/Application class 实例
如果您需要 'share' 应用程序之间的内存或对象,您需要序列化数据并 'transport' 它们通过诸如通信层之类的东西。
例如:
- TCP/IP
- 'Shared' 内存(命名管道)
- 文件
我在多个问题中都看到过这一点,但是很多被接受的答案都是矛盾的。
有人说,如果要跨应用程序和域使用对象的单个实例(实际上只是同步实例),则只能使用 IPC。
其他人说,在 GAC 中的程序集中使用单例模式会导致数据共享,因为如果 DLL 已被另一个程序集加载(前提是库具有单例模式),GAC 将共享一个实例。
有人帮我解决这个问题,我需要在多个线程中的多个应用程序之间共享一个全局对象,并且在我深入了解它之前需要知道它是否可以在没有 IPC(例如 WCF)的情况下实现。我更愿意使用 GAC,因为我的库更像是一个框架,无论如何,我和其他第 3 方开发人员开发的一套应用程序都会使用它。此外,速度是一个主要问题,serializing/deserializing 一个持续同步的对象可能会增加太多延迟,宁愿它是从多个位置引用的单个实例。
不,应用程序的每个实例都在为所有加载的程序集使用它自己的内存。甚至可以在一个应用程序中分隔两个单例实例 (通过使用 AppDomains)
单例模式可用于交叉汇编,但这将始终在一个 AppDomain 中。
所以两个应用程序不共享 memory/object 个实例。
这是期望的行为,因为您不希望其他应用程序访问您的 Thread/Dispatcher/AppDomain(并在您的应用程序中加载自定义程序集)/Application class 实例
如果您需要 'share' 应用程序之间的内存或对象,您需要序列化数据并 'transport' 它们通过诸如通信层之类的东西。
例如:
- TCP/IP
- 'Shared' 内存(命名管道)
- 文件