.NET DLL和线程/不同实例

时间:2010-09-03 22:58:31

标签: .net dll loadlibrary

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

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

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

这是否会创建一个独特的类实例(即在主程序的每个线程中调用函数'C'是安全的)还是我必须以某种方式动态加载DLL。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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