【问题标题】:.NET DLLs and threads / distinct instances.NET DLL 和线程/不同的实例
【发布时间】:2010-09-03 22:58:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您只需要线程安全,还是需要所有静态变量的不同实例等?
  • @bdonlan - 我需要所有静态变量等的不同实例,以及线程安全(也许它们齐头并进)。

标签: .net dll loadlibrary


【解决方案1】:

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

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

【讨论】:

  • 感谢弗朗西的回复。所以如果dll类'B'有公共变量'A',那么该类的所有实例都将使用变量'A',而不是它们自己的副本,对吗?
【解决方案2】:

您可能正在寻找Thread Local Storage,如果您需要,请在您的字段中使用ThreadStatic 属性。

【讨论】:

    最近更新 更多