완전 신뢰 asp.net mvc 2 응용 프로그램의 컨텍스트에서 둘 사이에 차이점이 있는지 확인하고 싶었습니다.AppDomain.GetAssemblies와 BuildManager.GetReferencedAssemblies의 차이점
27
A
답변
51
.NET Framework는 어셈블리가 필요할 때까지 현재 AppDomain에로드하는 것을 지연합니다. 예를 들어, SomeMethod()에서만 타사 라이브러리를 호출하면 일반적으로 SomeMethod()가 실행될 때까지 타사 DLL이로드되지 않습니다.
AppDomain.GetAssemblies()는 현재 AppDomain에 이미로드 된 모든 어셈블리를 제공합니다. BuildManager.GetReferencedAssemblies()는 Web.config 및 기타 위치에서 참조되는 모든 어셈블리의 목록을 반환하고 이러한 어셈블리를 현재 AppDomain으로로드합니다.
위의 해결 된 예는 다음과 같습니다.
- SomeMethod()가 아직 실행되지 않았습니다.
- AppDomain.GetAssemblies()를 호출하면 ThirdParty.dll을 포함하지 않는 집합을 반환합니다.
- SomeMethod()를 호출하십시오.
- AppDomain.GetAssemblies()를 호출하면 ThirdParty.dll이 포함 된 집합이 반환됩니다.
이 예제에서 CLR은 반드시 필요할 때까지 ThirdParty.dll을 현재 AppDomain으로로드하는 것을 연기합니다. 그리고 SomeMethod()가 실행될 때 필요하기 때문에로드되면됩니다. 또한
:
- 것으로 someMethod()는 아직 실행되지 않았습니다.
- AppDomain.GetAssemblies()를 호출하면 ThirdParty.dll을 포함하지 않는 집합을 반환합니다.
- BuildManager.GetReferencedAssemblies()를 호출하면 ThirdParty.dll이 포함 된 집합이 반환됩니다.
- AppDomain.GetAssemblies()를 호출하면 ThirdParty.dll이 포함 된 집합이 반환됩니다.
여기서 SomeMethod()를 호출하지는 않았지만 BuildManager.GetReferencedAssemblies() 호출은 사용자를 대신하여 타사 라이브러리를 현재 AppDomain으로로드했습니다.
물론 이것은 모두 특정 최적화 등이 있습니다. 그러나 일반적인 생각은 유지됩니다.
@starblue : 투표를 설명해 주시겠습니까? – Herman
질문 해 주셔서 감사합니다. 나는 BuildManager가 존재한다는 것을 몰랐다. 그것은 단지 나를 완전히 구했다. (Levi가 설명한 동작 때문에) –