库 (DLL) 中的静态变量是不是由引用该库的所有进程共享?
Posted
技术标签:
【中文标题】库 (DLL) 中的静态变量是不是由引用该库的所有进程共享?【英文标题】:Is a static variable in a library (DLL) shared by all processes referencing that library?库 (DLL) 中的静态变量是否由引用该库的所有进程共享? 【发布时间】:2011-10-12 16:21:13 【问题描述】:我知道 Web 应用程序中使用的静态变量是为整个 Web 应用程序的所有用户共享的。如果我有一个使用某个静态私有变量的库 (DLL),是否所有使用该库的应用程序都共享该变量的值?
例如,假设我的 DLL 中有以下代码:
private static bool isConnected = false;
public static void Connect()
// TODO: Connect.
isConnected = true;
public static void Disconnect()
// TODO: Disconnect.
isConnected = false;
然后在应用程序 A 中,我调用 myDLL.Connect()
,它将 isConnected
的值设置为 True
。然后我有一些应用程序 B 做同样的事情。如果应用程序 A 稍后调用 myDLL.Disconnect()
,应用程序 B 是否将 isConnected
视为 False
,因为这两个应用程序使用静态变量共享同一个 DLL 文件?在这种情况下,DLL 文件实际上是相同文件路径中的相同文件。
(我之前问过一个有点类似的关于网络应用的问题here. 不相关。)
【问题讨论】:
【参考方案1】:不,他们不会。它们在单独的AppDomains
中加载,并且无法看到彼此的实例。
即使它们引用相同的物理文件,每个应用程序也会获得自己的私有实例的程序集。
【讨论】:
这是否意味着如果 X 应用程序使用相同的 DLL,那么每个应用程序都会有 X 个程序集实例?只需确认一次。 简短回答 - 是的。长答案:这里的关键字是AppDomain
。如果有X AppDomains
,那么就会有X
实例。默认情况下,每个 App 都有自己的 AppDomain,这意味着对于 X
应用程序,将有 X
实例。您可以通过多种方式在同一个域中加载多个应用程序,但这是一个不同的讨论。
谢谢,不知道这个。为此 +1以上是关于库 (DLL) 中的静态变量是不是由引用该库的所有进程共享?的主要内容,如果未能解决你的问题,请参考以下文章