我的场景如下:
- 创建新的 AppDomain
- 加载一些程序集
- 对加载的 dll 施展魔法
- 卸载 AppDomain 以释放内存和加载的库
下面是我尝试使用的代码
class Program
{
static void Main(string[] args)
{
Evidence e = new Evidence(AppDomain.CurrentDomain.Evidence);
AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
Console.WriteLine("Creating new AppDomain");
AppDomain newDomain = AppDomain.CreateDomain("newDomain", e, setup);
string fullName = Assembly.GetExecutingAssembly().FullName;
Type loaderType = typeof(AssemblyLoader);
var loader = (AssemblyLoader)newDomain.CreateInstanceFrom(loaderType.Assembly.Location, loaderType.FullName).Unwrap();
Console.WriteLine("Loading assembly");
Assembly asm = loader.LoadAssembly("library.dll");
Console.WriteLine("Creating instance of Class1");
object instance = Activator.CreateInstance(asm.GetTypes()[0]);
Console.WriteLine("Created object is of type {0}", instance.GetType());
Console.ReadLine();
Console.WriteLine("Unloading AppDomain");
instance = null;
AppDomain.Unload(newDomain);
Console.WriteLine("New Domain unloaded");
Console.ReadLine();
}
public class AssemblyLoader : MarshalByRefObject
{
public Assembly LoadAssembly(string path)
{
return Assembly.LoadFile(path);
}
}
}
library.dll 仅包含一个虚拟类,带有一个巨大的字符串表(以便于跟踪内存消耗)
现在的问题是内存实际上并没有被释放。更令人惊讶的是,在 AppDomain.Unload() 之后内存使用量实际上增加了
任何人都可以阐明这个问题吗?
最佳答案
这不是一个完整的答案:我只是注意到您使用字符串作为负载。字符串对此没有用,因为文字字符串是驻留的。驻留字符串在 AppDomain 之间共享,因此当您卸载 AppDomain 时不会卸载该部分。尝试使用 byte[] 代替。
关于c# - 使用 AppDomain 加载/卸载外部程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687245/