2012-09-17 7 views
0

가능한 중복 :
Unloading the Assembly loaded with Assembly.LoadFrom()어셈블리가 여전히 표시되는 이유는 무엇입니까?

나는 어셈블리를 넣기/사용자 정의 AppDomain를 사용합니다. 그러나 조립품을 내릴 때 AppDomain.CurrentDomain에서 볼 수 있습니다.

어떻게 될 수 있습니까? 이 정상적인 행동입니까, 아니면 뭔가 빠졌습니까?

실마리를 가져 주셔서 감사합니다.

string assemblyPath = @"C:\MyFile.dll"; 
var assemblyName = AssemblyName.GetAssemblyName(assemblyPath); 

      var ads = new AppDomainSetup 
          { 
           ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase, 
           DisallowCodeDownload = true 
          }; 

      AppDomain newDomainName = AppDomain.CreateDomain("newDomainName", null, ads); 
       try 
       { 
        Assembly testLibrary = newDomainName.Load(assemblyName); 

        var c1 = AppDomain.CurrentDomain.GetAssemblies(); 

        var c2 = newDomainName.GetAssemblies(); 
       } 
       finally 
       { 
        AppDomain.Unload(newDomainName); 

        var c3 = AppDomain.CurrentDomain.GetAssemblies(); 

        // The assembly is still visible here!!! 
       } 
+0

@asawyer 아니오 중복 된 질문이 아닙니다. 새 AppDomain을 사용하여로드 된 어셈블리를 유지합니다. –

답변

4

당신은에 따른 응용 프로그램 도메인의 Load() 메소드를 호출하는 documentation :. "현재 응용 프로그램 도메인에 어셈블리를로드하는 데에만 사용되어야한다이 방법은 호출 할 수 없습니다 상호 운용성 호출자의 편의를 제공 정적 Assembly.Load 메서드 다른 응용 프로그램 도메인에 어셈블리를로드하려면 CreateInstanceAndUnwrap와 같은 메서드를 사용하십시오. " 당신이에서 기본 응용 프로그램 도메인을 Load()를 호출하고 있기 때문에 즉

, 당신은 기본 응용 프로그램 도메인에 어셈블리를로드하는,이 (심지어 당신이 당신의 차의 AppDomain의 인스턴스에 호출 사용하고 있지만) 보조 AppDomain을 언로드 한 후에도 나타나는 이유입니다.

위의 설명서에서 추출한 내용에 따르면 AppDomain.CreateInstanceAndUnwrap을 사용하려고합니다.

2

로드 된 어셈블리를 앱 도메인에서 제거 할 수 없습니다.

http://msdn.microsoft.com/en-us/library/ms173101(v=vs.80).aspx

http://blogs.msdn.com/b/jasonz/archive/2004/05/31/145105.aspx

가 포함 된 응용 프로그램 도메인의 모든 를 언로드하지 않고 개별 어셈블리를 언로드 할 수있는 방법이 없습니다. 어셈블리가 범위를 벗어나더라도 실제 어셈블리 파일은 모든 응용 프로그램 도메인이 언로드 될 때까지로드 된 상태로 유지됩니다.

http://blogs.msdn.com/b/suzcook/archive/2003/07/08/unloading-an-assembly.aspx

가 포함 된 응용 프로그램 도메인의 모든 를 언로드하지 않고 개별 어셈블리를 언로드 할 수있는 방법은 없습니다.

+0

하지만 언로드 중입니다. AppDomain.Unload (newDomainName); 내가 틀린 곳을 말해 줄래? –

+0

@ Peretz Iridium이 맞습니다. 어셈블리를 잘못로드하고 있습니다. – asawyer

관련 문제