在 appDomain 上下文中运行时,对所有线程强制实施静态变量的一个通用实例

本文关键字:变量 静态 实例 一个 施静态 运行时 上下文 appDomain 线程 | 更新日期: 2023-09-27 18:32:16

环境:包含托管 + 本机代码的多个 dll/程序集的 .NET 程序。程序执行的第一个操作是在命名空间(例如命名空间 A)内创建从 MarshalByRefObject 继承的类(例如 classA)的实例。

作为类 A 构造函数的一部分完成的操作:

  • 分配新类(例如类 B)。类 B 包含静态变量。
  • 创建线程。线程的实际创建是通过调用"WinBase"CreateThread"函数在本机代码的上下文中完成的。

问题:在 appDomain 的上下文中定义类 A 的实例时,类 B 静态变量并非对所有线程通用。

用于加载程序 dll 并在 appDomain 中创建类 A 实例的代码:

System.AppDomain app_domain = System.AppDomain.CreateDomain("app domain");
object winfw_host = app_domain.CreateInstanceFromAndUnwrap(@"C:'...'dll_name.dll", "namespaceA.classA");

注意:当定义不在 appDomain 上下文中的类 A 实例时,类 B 静态变量对所有线程都是通用的。

问题:

我本来期望相同的行为(应用程序域和非应用程序域上下文),差异的原因是什么?

在 appDomain 的上下文中运行时,是否可以对所有线程强制实施一个静态变量的通用实例?

在 appDomain 上下文中运行时,对所有线程强制实施静态变量的一个通用实例

静态变量的作用域恰好是包含的 AppDomain。为了恢复此限制,我建议使用一些棘手的方法。

您选择一个应用程序域(假设 A)。类公开以下非静态方法。

GetData(String)
SetData(String, Object)

尝试存储 A.SetData 共享的所有 AppDomain 共享的值("您的密钥",值),并通过 A.GetData("您的密钥")检索值

在访问 AppDomain A 时,您还需要考虑线程安全访问。

>Microsoft批准在appDomian上下文中创建多线程时,静态变量并非对所有线程都是通用的(与非appDomain不同,所有线程都有一个静态变量),这是C++/CLI的实现方式。要满足此类要求,建议创建一个委托类型来包装托管方法调用,以便将其传递给本机代码到本机线程中,因为委托会跨本机线程保留该 AppDomain 信息。基本上,您创建托管委托,为委托分配一个 GCHandle 以在本机C++代码中引用它,然后在 GCHandle 上调用 Marshal::GetFunctionPointerForDelegate 以获取指向委托的本机函数指针。最后一部分需要将 IntPtr 静态强制转换为本机函数类型。然后,可以跨线程传递获取的本机函数指针。