Вызов функции из dll, и выгрузка ее через c#
Мне нужно чтобы файл dll выгружался через определенное время, если функция не завершилась раньше,
но в консоли получаю сообщение о том что меня класс AssemblyLoadContext побрил, и функция Unload() не закрывает процесс dll, скорее всего это связано с тем что в документации Microsoft сказано, что функция закрывает процесс используя async, а это значит что еще не известно через какое время она закроет функцию.
CustomAssemblyLoadContext.cs
using System.Runtime.Loader;
using System.Reflection;
namespace WebApplication3.Service
{
public class CustomAssemblyLoadContext : AssemblyLoadContext
{
public CustomAssemblyLoadContext() : base(isCollectible: true)
{
}
protected override Assembly Load(AssemblyName assemblyName)
{
return null;
}
}
}
Service.cs
using Microsoft.Extensions.Hosting;
using System;
using System.Reflection;
using System.Runtime.Loader;
using System.Threading;
using System.Threading.Tasks;
namespace WebApplication3.Service
{
public class UsersService : IHostedService
{
private Task process { get; set; }
public Task StartAsync(CancellationToken cancellationToken)
{
process = Task.Run(() => Worker());
return Task.CompletedTask;
}
private void Worker()
{
Console.WriteLine("Подготовка функции");
var context = new CustomAssemblyLoadContext();
context.Unloading += Unloadings;
Assembly assembly = context.LoadFromAssemblyPath(@"D:\source\repos\CreateDll\bin\Debug\CreateDll.dll");
var type = assembly.GetType("CreateDll.Program");
var greetMethod = type.GetMethod("Main");
var instance = Activator.CreateInstance(type);
// через 5 секунд выгружаем функцию
Task.Run(() =>
{
Thread.Sleep(5000);
context.Unload();
// очистка
for (var i = 0; i < 10; i++)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
Console.WriteLine("Выгрузка функции");
});
// вызов функции
Console.WriteLine("Вызов функции");
greetMethod.Invoke(instance, null);
Console.WriteLine("Конец выполнения");
}
private static void Unloadings(AssemblyLoadContext obj)
{
Console.WriteLine("unload function");
}
public Task StopAsync(CancellationToken cancellationToken)
{
process.Dispose();
return Task.CompletedTask;
}
}
}
CreateDll.cs
using System;
using System.Threading;
namespace CreateDll
{
public class Program
{
public static void Main()
{
while (true)
{
Console.WriteLine("function process");
Thread.Sleep(5000);
}
}
}
}
в консоли получаю:
Подготовка функции
Вызов функции
function process
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: D:\source\repos\WebApplication3\bin\Debug\netcoreapp3.1
unload function
function process
Выгрузка функции
function process
function process
function process
function process
function process
function process
function process
function process