Загрузка сборки в новый домен приложений без загрузки в родительский домен приложений - PullRequest
18 голосов
/ 26 апреля 2010

Я пытаюсь загрузить dll в консольное приложение, а затем выгрузить его и полностью удалить файл. Проблема, с которой я столкнулся, заключается в том, что при загрузке библиотеки DLL в ее собственном домене приложений создается ссылка в родительском домене приложений, что не позволяет мне уничтожить файл библиотеки DLL, пока я полностью не закрою программу. Есть мысли о том, чтобы этот код работал?

string fileLocation = @"C:\Collector.dll";
AppDomain domain = AppDomain.CreateDomain(fileLocation);
domain.Load(@"Services.Collector");
AppDomain.Unload(domain);

Кстати, я тоже пробовал этот код, но безуспешно

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); 

Ответы [ 2 ]

5 голосов
/ 26 апреля 2010

ОК, поэтому я решил свою проблему здесь. Очевидно, что если вы вызовете AppDomain.Load, он зарегистрирует его в родительском AppDomain. Поэтому достаточно просто, чтобы не ссылаться на него вообще. Это ссылка на сайт, который показывает, как правильно это настроить.

https://bookie.io/bmark/readable/9503538d6bab80

4 голосов
/ 21 ноября 2015

Это должно быть достаточно просто:

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);
    }
  }
}
...