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

标签 c# .net

我的场景如下:

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

相关文章:

c# - 将 LineGeometry 与 EllipseGeometry 组合(在代码中,而不是 XAML)

c# - 您是否将存储库模式与 Entity Framework 一起使用?

.net - 如何在 RabbitMQ 中设置重试次数?

DD/MM/YY 的 JavaScript 验证

c# - InternalsVisibleTo 用于动态生成的程序集,但具有强大的命名

c# - Azure Web 角色访问外部 Web 服务时遇到问题

c# - 在 Visual Studio 2008 中更改单元测试项目的输出路径

c# - C#中作为静态多态的方法重载

c# - 如何使 ExecuteAsync 异步运行

.net - 使用Microsoft WCF对P2P分布式系统进行编程