このように.NET Core/.NET 5以降ではファイナライザの実行が保証されない場合があるため、代替手段としてAssemblyLoadContext.Unloadingイベントが追加されています。 実装したい終了処理がクリティカルな場合は、このイベントを捕捉し、そこで終了処理を行うようにする必要があります。 特に、プロセス終了とともに自動的に解放されないようなリソースを扱う場合は、ファイナライザではなくAssemblyLoadContext.Unloadingイベントで解放処理を行う必要があります。

AssemblyLoadContext.Unloadingイベントを捕捉して終了処理を行う .NET Standard 1.6/.NET Core 2.0
using System;
using System.Runtime.Loader;

class Sample {
  static void Main()
  {
    // AssemblyLoadContext.Unloadingイベントで必要な終了処理を行う
    AssemblyLoadContext.GetLoadContext(typeof(Sample).Assembly).Unloading += (ctx) => Console.WriteLine("unload");

    Console.WriteLine("end");
  }
}