gpt4 book ai didi

c# - 使用 AppDomain 加载/卸载外部程序集

转载 作者:可可西里 更新时间:2023-11-01 08:03:39 26 4
gpt4 key购买 nike

我的场景如下:

  • 创建新的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com