假设我有一个带有'B'类和函数'C'的.NET dll。
然后我有一个引用dll的多线程.NET程序。
每个线程实例化类'B'并调用函数'C'。在实例化时,类'B'在堆上分配它自己的所有变量。这些变量由函数“C”使用。
这是否会创建一个独特的类实例(即在主程序的每个线程中调用函数'C'是安全的)还是我必须以某种方式动态加载DLL。
(换句话说,.NET DLL的行为类似于Win32 LoadLibrary函数(引用计数),您必须给一个dll不同的名称,然后加载它们,以创建不同的实例。)
答案 0 :(得分:1)
在.Net中,类型解析基于assembly name,而不是二进制名称。因此,即使您设法在进程内存中获取dll的两个副本,类B
的类型定义也将相同,并将使用相同的静态变量实例。
但是,每个线程都可以在单独的appdomain中加载程序集,在这种情况下,每个appdomain都会获得自己的静态变量实例。缺点是每次调用方法C
时,您的代码都会跨越appdomain边界。
答案 1 :(得分:0)
您可能正在寻找Thread Local Storage,如果您追求的话,请使用字段上的ThreadStatic属性。