1

假设我有一个带有“B”类和“C”函数的 .NET dll。

然后我有一个引用 dll 的多线程 .NET 程序。

每个线程实例化类'B'并调用函数'C'。实例化后,类“B”在堆上分配它自己的所有变量。这些变量由函数“C”使用。

这是否会创建该类的不同实例(即在主程序的每个线程中调用函数“C”是否安全),或者我是否必须以某种方式动态加载 DLL。

(换句话说,.NET DLL 的行为是否类似于 Win32 LoadLibrary 函数(引用计数),您必须为一个 dll 指定不同的名称,然后加载这些名称,以创建不同的实例。)

4

2 回答 2

1

在 .Net 中,类型解析基于程序集名称,而不是二进制名称。因此,即使您设法在进程内存中获得 dll 的两个副本,类的类型定义B也将是相同的,并且将使用相同的静态变量实例。

但是,您的每个线程都可以将程序集加载到单独的 appdomain 中,在这种情况下,每个 appdomain 都会获得自己的静态变量实例。缺点是您的代码每次调用该方法时都会跨越 appdomain 边界C

于 2010-09-03T23:13:18.867 回答
0

您可能正在寻找Thread Local Storage ,如果这是您所追求的,请在您的字段上使用ThreadStatic属性。

于 2010-09-09T09:16:17.230 回答