2010-03-19 1 views
27

완전 신뢰 asp.net mvc 2 응용 프로그램의 컨텍스트에서 둘 사이에 차이점이 있는지 확인하고 싶었습니다.AppDomain.GetAssemblies와 BuildManager.GetReferencedAssemblies의 차이점

+0

@starblue : 투표를 설명해 주시겠습니까? – Herman

+1

질문 해 주셔서 감사합니다. 나는 BuildManager가 존재한다는 것을 몰랐다. 그것은 단지 나를 완전히 구했다. (Levi가 설명한 동작 때문에) –

답변

51

.NET Framework는 어셈블리가 필요할 때까지 현재 AppDomain에로드하는 것을 지연합니다. 예를 들어, SomeMethod()에서만 타사 라이브러리를 호출하면 일반적으로 SomeMethod()가 실행될 때까지 타사 DLL이로드되지 않습니다.

AppDomain.GetAssemblies()는 현재 AppDomain에 이미로드 된 모든 어셈블리를 제공합니다. BuildManager.GetReferencedAssemblies()는 Web.config 및 기타 위치에서 참조되는 모든 어셈블리의 목록을 반환하고 이러한 어셈블리를 현재 AppDomain으로로드합니다.

위의 해결 된 예는 다음과 같습니다.

  1. SomeMethod()가 아직 실행되지 않았습니다.
  2. AppDomain.GetAssemblies()를 호출하면 ThirdParty.dll을 포함하지 않는 집합을 반환합니다.
  3. SomeMethod()를 호출하십시오.
  4. AppDomain.GetAssemblies()를 호출하면 ThirdParty.dll이 포함 된 집합이 반환됩니다.

이 예제에서 CLR은 반드시 필요할 때까지 ThirdParty.dll을 현재 AppDomain으로로드하는 것을 연기합니다. 그리고 SomeMethod()가 실행될 때 필요하기 때문에로드되면됩니다. 또한

:

  1. 것으로 someMethod()는 아직 실행되지 않았습니다.
  2. AppDomain.GetAssemblies()를 호출하면 ThirdParty.dll을 포함하지 않는 집합을 반환합니다.
  3. BuildManager.GetReferencedAssemblies()를 호출하면 ThirdParty.dll이 포함 된 집합이 반환됩니다.
  4. AppDomain.GetAssemblies()를 호출하면 ThirdParty.dll이 포함 된 집합이 반환됩니다.

여기서 SomeMethod()를 호출하지는 않았지만 BuildManager.GetReferencedAssemblies() 호출은 사용자를 대신하여 타사 라이브러리를 현재 AppDomain으로로드했습니다.

물론 이것은 모두 특정 최적화 등이 있습니다. 그러나 일반적인 생각은 유지됩니다.

+1

BuildManager를 유지하는 유일한 방법은 System.Web.dll을 참조하는 것입니다. 좀 이상해. – Ted

+0

@Ted이 문제가 무엇입니까? 위의 대답은 상당히 단순화되었지만 BuildManager의 개념은 ASP.NET 응용 프로그램 내에서 실제로 의미가 있습니다. – Levi

+1

예, System.Web.dll을 참조하고 BuildManager를 사용하면 ASP.NET 프로젝트가 아닌 경우 예외가 발생합니다. WinForms에서는 이것을 할 수 없습니다. – Ted