卸载CollectibleAssemblyLoadContext的问题,垃圾回收期间程序崩溃

时间:2019-06-22 00:25:32

标签: c# reflection .net-core garbage-collection

第一次在这里发帖,希望你们能帮助我。

我正在创建一个无需重新启动应用程序即可加载和卸载程序集的应用程序。

第一次加载和卸载程序集的工作就没有问题,但是在加载和卸载DLL时,在我遇到应用程序崩溃之前已经被卸载了。有时,dll将在应用程序崩溃之前加载/卸载几次,但它总是在同一行崩溃(GC.WaitForPendingFinalizers();)。

我正在Visual Studio prof 2019 16.1.3版中使用.net core 3预览6。

我做错什么了吗,或者这可能是.net核心中的错误?

请参阅以下有关存在问题的示例代码。

using System;
using System.Reflection;
using System.Runtime.Loader;

namespace ConsoleApp1 {
    class Program {

        static void Main() {
            try {
                for (int index = 0; index < 99; index++) {
                    WeakReference weakReference = Load(@"C:\TestAssembly.dll"); ;
                    for (var i = 0; i < 8 && weakReference.IsAlive; i++) {
                        GC.Collect();
                        Console.WriteLine($"\tGC.Collect done!");
                        GC.WaitForPendingFinalizers();
                        Console.WriteLine($"\tGC.WaitForPendingFinalizers done!");
                    }
                    Console.WriteLine(Environment.NewLine + $"Unloading assembly: {(!weakReference.IsAlive ? "success" : "failed")}!");
                }
            } catch (Exception exception) {
                Console.WriteLine(exception.Message);
            }
        }

        public class CollectibleAssemblyLoadContext : AssemblyLoadContext {
            public CollectibleAssemblyLoadContext() : base(isCollectible: true) { }
        }

        private static WeakReference Load(string assemblyPath) {
            CollectibleAssemblyLoadContext context = new CollectibleAssemblyLoadContext();
            Assembly assembly = context.LoadFromAssemblyPath(assemblyPath);

            // Do something with loaded assembly
            // .......

            context.Unload();
            Console.WriteLine($"Unloading assembly");

            return new WeakReference(context);
        }
    }
}


using System;

namespace TestAssembly {
    public class Class1 {

    }
}

输出:

  

卸载程序集
  GC.Collect完成!
  GC.WaitForPendingFinalizers完成!
  GC.Collect完成!
  GC.WaitForPendingFinalizers完成!
  
  卸载程序集:成功!
  卸货总成
  GC.Collect完成!

随后出现程序崩溃:HRESULT = 0x80070057。 ErrorCode = 0x0。

0 个答案:

没有答案