我正在尝试使用AppDomain管理一些遗留代码的想法,其中包含许多静态字段在多线程环境中.
我读到了这个问题的答案:如何使用AppDomain限制静态类的范围以便线程安全使用?,认为它非常有前景,并决定在程序集ClassLibrary1.dll中使用一个非常简单的类来尝试它:
namespace ClassLibrary1
{
public static class Class1
{
private static int Value = 0;
public static void IncrementAndPrint()
{
Console.WriteLine(Value++);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码,它将程序集加载到2个不同的应用程序域并多次调用IncrementAndPrint():
var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");
var assemblyInAppDomain1 = appDomain1.Load("ClassLibrary1");
var assemblyInAppDomain2 = appDomain2.Load("ClassLibrary1");
var class1InAppDomain1 = assemblyInAppDomain1.GetType("ClassLibrary1.Class1");
var class1InAppDomain2 = assemblyInAppDomain2.GetType("ClassLibrary1.Class1");
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", …Run Code Online (Sandbox Code Playgroud) 我有四个程序集,ModuleStatic,Loader以及ModuleA和ModuleB,除了可执行程序Loader之外,它们都是DLL。
在DLL ModuleStatic中:
public class ModuleStatic {
public static string Foo { get; set; } = "Foo";
}
Run Code Online (Sandbox Code Playgroud)
在Loader中,将通过Assembly.Load和AppDomain将ModuleA和ModuleB分别加载到domA和domB。如果ModuleA修改了ModuleStatic.Foo变量,则domB中的ModuleB会收到修改吗?