AssemblyLoadContext类本身不会隔离静态变量。静态变量是在程序域级别上进行管理的,而AssemblyLoadContext只负责加载和卸载程序集。
如果需要实现静态变量在不同的程序集加载上下文中的隔离,可以通过创建自定义的程序域来实现。下面是一个示例代码:
using System;
using System.Reflection;
public class CustomAssemblyLoadContext : AssemblyLoadContext
{
private AssemblyDependencyResolver _resolver;
public CustomAssemblyLoadContext(string mainAssemblyPath) : base(isCollectible: true)
{
_resolver = new AssemblyDependencyResolver(mainAssemblyPath);
}
protected override Assembly Load(AssemblyName assemblyName)
{
string assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName);
if (assemblyPath != null)
{
return LoadFromAssemblyPath(assemblyPath);
}
return null;
}
public void UnloadAllAssemblies()
{
foreach (Assembly assembly in GetLoadedAssemblies())
{
Unload(assembly);
}
}
}
public static class MyStaticClass
{
public static string MyStaticVariable = "Hello, World!";
}
public class Program
{
public static void Main(string[] args)
{
string mainAssemblyPath = Assembly.GetEntryAssembly().Location;
CustomAssemblyLoadContext context1 = new CustomAssemblyLoadContext(mainAssemblyPath);
Assembly assembly1 = context1.LoadFromAssemblyPath(mainAssemblyPath);
// 在这个上下文中使用静态变量
Console.WriteLine(MyStaticClass.MyStaticVariable);
context1.UnloadAllAssemblies();
CustomAssemblyLoadContext context2 = new CustomAssemblyLoadContext(mainAssemblyPath);
Assembly assembly2 = context2.LoadFromAssemblyPath(mainAssemblyPath);
// 在另一个上下文中使用静态变量
Console.WriteLine(MyStaticClass.MyStaticVariable);
context2.UnloadAllAssemblies();
Console.ReadLine();
}
}
在这个示例中,我们创建了一个自定义的AssemblyLoadContext类CustomAssemblyLoadContext。在Load方法中,我们使用AssemblyDependencyResolver来解析程序集的依赖项并加载程序集。在Main方法中,我们创建了两个不同的CustomAssemblyLoadContext实例,每个实例都加载了相同的主程序集。我们可以看到,每个上下文中的静态变量MyStaticVariable都是独立的,并且在上下文切换时保持不变。