2013-08-05 3 views
0

Я застрял на третий день с этой проблемой, и у меня нет заблудшей идеи, почему это не работает. Я просто хочу загрузить внешнюю .dll, чтобы прочитать некоторую информацию, используя отражение и удалить файл в конце концов. Проблема в том, что файлы чтения заблокированы. Самое странное, что только два файла заблокированы, когда я прочитал 5 из них успешно. Я пробовал ShadowCopy без результата. Я понятия не имел.Новый файл разблокировки AppDomain

Это мой AppDomain класс:

public class AppDomainExpander 
    { 
     private Type[] _types; 
     public Type[] Types 
     { 
      get { return _types; } 
      set { _types = value; } 
     } 
     public void Create(string domainName, string path) 
     { 
      AppDomainSetup aps = new AppDomainSetup(); 
      aps.ShadowCopyFiles = "true"; 
      AppDomain dmn = AppDomain.CreateDomain(domainName); 
      string typename = typeof(DomainCommunicator).FullName; 
      string assemblyName = typeof(DomainCommunicator).Assembly.FullName; 
      var inner = (DomainCommunicator)dmn.CreateInstanceAndUnwrap(assemblyName, typename); 
      inner.Create(); 
      Assembly assembly = Assembly.LoadFrom(path); 
      Types = assembly.GetTypes(); 
      AppDomain.Unload(dmn); //it's strange that the code even work because i try to unload domain before i get Types[] 
     } 
     public class DomainCommunicator : MarshalByRefObject 
     { 
      public void Create() 
      { 
       AppDomain.CurrentDomain.DomainUnload += new EventHandler(OnDomainUnload); 
      } 

      void OnDomainUnload(object sender, EventArgs e) 
      { 
       AppDomain.CurrentDomain.DomainUnload -= new EventHandler(OnDomainUnload); 
      } 
     } 
    } 

И это, как я пытаюсь использовать его:

var expander = new AppDomainExpander(); 
expander.Create("MyDomain", file.Path); 
foreach (var type in expander.Types) 

ответ

0

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

1

Типы загружаются в ваш основной AppDomain, у которого нет функции ShadowCopy. Вот почему файлы заблокированы.

Вам нужно будет загрузить сборку в методе DomainCommunicator.Create. Обратите внимание, что вы не можете сохранить свойство Types. Это приведет к утечке типов из дочернего элемента AppDomain в основной и проблем с блокировкой файлов, с которыми вы сталкиваетесь.