2013-08-05 2 views
0

이 문제로 3 일째에 갇혀 있는데 왜 작동하지 않는지 이상한 생각이 없습니다. 난 그냥 리플렉션을 사용하여 일부 정보를 읽고 외부에서 파일을 삭제하려면 외부 .dll을로드하고 싶습니다. 문제는 읽기 파일이 잠겨 있다는 것입니다. 가장 이상한 점은 두 파일 만 잠긴 상태이며 그 중 5 파일은 성공적으로 읽는 것입니다. ShadowCopy를 아무런 결과없이 시도했습니다. 나는 지금 단서가 없다.새 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

ShadowCopy 기능이 활성화되지 않은 메인 AppDomain에로드됩니다. 이것이 파일이 잠긴 이유입니다.

대신 DomainCommunicator.Create 방법으로 어셈블리를로드해야합니다. Types 속성은 유지할 수 없습니다. 이렇게하면 자식 AppDomain에서 주체로 유출되는 유형과 현재 직면하고있는 파일 잠금 문제가 발생합니다.