2010-12-21 5 views
3

플러그인 시스템에서 개체를 인스턴스화하고 일부 식별자 (단순히 문자열)가있는 들어오는 요청을 기반으로 해당 개체의 메서드를 호출합니다. 구성 식별자를 사용하여이 식별자는로드 할 어셈블리, 인스턴스화 할이 어셈블리의 클래스 및 호출 할 메서드를 결정합니다. 어셈블리는 별도의 AppDomain에로드됩니다.불필요한 Assembly.LoadFrom 호출을 피하기 위해 Assembly 객체에 대한 참조를 유지하는 것이 좋거나 나쁘지 않습니까?

string assemblyFileName = GetAssemblyFileNameFromConfig(identifier); 
Assembly assembly = Assembly.LoadFrom(assemblyFileName); 
// Instantiate and run something in assembly 

질문 : 제가 위에서 언급 한 identifier 관련이 어셈블리를로드 SecondDomainProxy

secondDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().CodeBase, 
    typeof(SecondDomainProxy).FullName) as SecondDamainProxy; 

클래스에서이은과 같이 생성 된 프록시 클래스에서 일어나는가에 의미가 있는가 어셈블리가로드되면이 Assembly 객체에 대한 참조를 보유 하시겠습니까? 내가 어셈블리 영원히 Assembly.LoadFrom이의 첫 번째 호출 후로드되었는지 알고

Assembly assembly; 
if (!_assemblyDict.TryGetValue(identifier, out assembly)) 
{ 
    string assemblyFileName = GetAssemblyFileNameFromConfig(identifier); 
    assembly = Assembly.LoadFrom(assemblyFileName); 
    _assemblyDict[identifier] = assembly; 
} 
// Instantiate and run something in assembly 

하십시오 사전에 예 ...

Dictionary<string, Assembly> _assemblyDict; 

을 위해 ... 그리고 위의 코드를 변경하여 AppDomain이 언로드 될 때까지 (두 번째 AppDomain은 내 응용 프로그램의 주요 응용 프로그램만큼 오래 살아 있습니다.) 그러면 Assembly.LoadFrom에 대한 두 번째 호출이 저렴하거나 거의 비슷하지만 사전 조회처럼 저렴합니다. 또는 assembly.LoadFrom을 호출하지 않고 저장된 참조를 대신 사용하는 단점이 있습니까?

(내 느낌은 내가이없는 높은 성능 요구 사항 (하나 개의 요청 약 15 초마다)가 없다면 정말 중요하지 않습니다.하지만 내가 잘못 될 수 있다는 것입니다.)

이 주셔서 감사합니다 사전에 피드백을!

편집 :

Assembly는 "정상".NET 클래스입니다. 이 클래스의 인스턴스에 대한 참조가 없으면 가비지 수집이 수행됩니다. 그러나 어셈블리 자체는 여전히로드되어 있습니다. 따라서 Assembly.LoadFrom은 적어도 Assembly 클래스의 새 인스턴스를 만들 필요가 있지만,이 인스턴스 생성은 이미로드 된 어셈블리를 기반으로 할 수 있습니다.

저는 질문을 추가하고 싶습니다 : 주어진 어셈블리에 대한 어셈블리 객체를 생성하려면 무거운 반향이 필요하며 어셈블리가로드되었는지 여부와 상관없이 항상 비싸지 않습니까?

+1

CLR은 이미이 작업을 수행합니다. –

+0

@ 한스 : 내 편집 내용을 살펴 보겠습니다. 질문에 추가 되었습니까? 귀하의 진술을 변경합니까? 로드 된 모든 어셈블리에는 새 인스턴스를 만드는 대신 단순히'LoadFrom'에 의해 반환되는 정적'Assembly' 객체가 할당되어 있습니까? – Slauma

+1

아니요, CLR은 여전히이 작업을 수행합니다. –

답변

1

아니요, 필요하지 않습니다. 일단 응용 프로그램 도메인에로드

가, 어셈블리,) (모든/가능한 어셈블리를로드 반환하는 기본 응용 프로그램 도메인 객체의 메소드를 GetAssemblies를 사용하여 액세스 할 수 S : http://msdn.microsoft.com/en-US/library/system.appdomain.getassemblies.aspx

하나 이상의 어셈블리를 언로드 할 수있는 유일한 방법 동일한 클래스의 정적 Unload() 메서드를 사용하여 AppDomain을 언로드하는 것입니다.