库 (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) 中的静态变量是不是由引用该库的所有进程共享?的主要内容,如果未能解决你的问题,请参考以下文章

静态库的未定义引用和奇怪的内容

多库项目中的 Android Studio proguard 处理

库通常带有头文件吗?

动态链接库和静态链接库的区别简述

静态库 动态库 调用

静态链接库的动态 DLL