库中的共享变量是否在引用该库的所有应用程序中共享它们的值?

时间:2017-03-17 07:05:09

标签: .net vb.net dll shared-memory shared

这可能是重复的。但是,我无法找到及时的解决方案。请帮帮我。

我有一个库项目,它有一个名为GetData(ByVal contextId as Integer)的类,用于从数据库中获取数据并将它们存储到名为Public Shared _ContextData As String的共享变量中。而且,这个库项目由三个窗口应用程序引用。

如果我的三个Windows应用程序同时运行并尝试使用该库中的上述方法从数据库中获取具有不同contextId的数据。

是否有可能在整个应用程序中共享任何一个contextId值?

我已经在下面提到了链接。但是,他们告诉了Web应用程序的解决方案。

Link 1

Link 2

2 个答案:

答案 0 :(得分:2)

不,Shared变量绑定到ApplicationDomain(通常每个进程有一个)。因此,在您的情况下,您的Windows应用程序的每个进程都有一个单独的内存变量。如果你运行每个Windows应用程序,你就有3个,如果你运行每个windows应用程序的两个实例,你就有6个单独的变量。

如果您希望跨流程边界共享价值,则必须研究跨流程通信技术,如WCF或命名管道通信。此外,创建服务是一种选择。

更简单的选项是将值存储在数据库或每个应用程序访问的文件中。在这两个选项中,当两个应用程序同时访问该值时,您需要考虑如何处理并发情况。

如果选择contextId后没有更改,则选项是拥有主应用程序并在此应用程序中选择contextId。您将从此主应用程序启动其他应用程序(例如,使用Process.Start)并将contextId作为命令行参数移交。这些“子”应用程序使用在启动时提供给它们的contextId

答案 1 :(得分:2)

Shared仅针对每个应用程序共享, 并非所有 应用程序,我很害怕。加载DLL时,将其加载到应用程序的内存中,因此每个应用程序都有自己的库实例加载到应用程序内存中(这就是为什么Shared不能跨应用程序工作的原因)。

如果您想在多个应用程序之间共享数据,请查看Memory Mapped Files