Загрузите сборку в новый AppDomain без загрузки в Parent AppDomain
Я пытаюсь загрузить DLL в консольное приложение, а затем выгрузить его и полностью удалить файл. Проблема, с которой я столкнулась, заключается в том, что действие по загрузке dll в свой собственный AppDomain создает ссылку в Parent AppDomain, не позволяя мне уничтожить файл dll, если я полностью не выключу программу. Любые мысли о создании этого кода работают?
string fileLocation = @"C:\Collector.dll";
AppDomain domain = AppDomain.CreateDomain(fileLocation);
domain.Load(@"Services.Collector");
AppDomain.Unload(domain);
BTW Я тоже пробовал этот код без везения
string fileLocation = @"C:\Collector.dll";
byte[] assemblyFileBuffer = File.ReadAllBytes(fileLocation);
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = Environment.CurrentDirectory;
domainSetup.ShadowCopyFiles = "true";
domainSetup.CachePath = Environment.CurrentDirectory;
AppDomain tempAppDomain = AppDomain.CreateDomain("Services.Collector", AppDomain.CurrentDomain.Evidence, domainSetup);
//Load up the temp assembly and do stuff
Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer);
//Then I'm trying to clean up
AppDomain.Unload(tempAppDomain);
tempAppDomain = null;
File.Delete(fileLocation);
Ответы
Ответ 1
ОК, поэтому я решил свою проблему здесь. Очевидно, если вы вызовете AppDomain.Load, он зарегистрирует его с вашим родительским AppDomain. Поэтому достаточно просто ответить, чтобы не ссылаться на него вообще. Это ссылка на сайт, который показывает, как правильно настроить его.
https://bookie.io/bmark/readable/9503538d6bab80
Ответ 2
Это должно быть достаточно просто:
namespace Parent {
public class Constants
{
// adjust
public const string LIB_PATH = @"C:\Collector.dll";
}
public interface ILoader
{
string Execute();
}
public class Loader : MarshalByRefObject, ILoader
{
public string Execute()
{
var assembly = Assembly.LoadFile(Constants.LIB_PATH);
return assembly.FullName;
}
}
class Program
{
static void Main(string[] args)
{
var domain = AppDomain.CreateDomain("child");
var loader = (ILoader)domain.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName);
Console.Out.WriteLine(loader.Execute());
AppDomain.Unload(domain);
File.Delete(Constants.LIB_PATH);
}
}
}