플러그인 시스템에서 개체를 인스턴스화하고 일부 식별자 (단순히 문자열)가있는 들어오는 요청을 기반으로 해당 개체의 메서드를 호출합니다. 구성 식별자를 사용하여이 식별자는로드 할 어셈블리, 인스턴스화 할이 어셈블리의 클래스 및 호출 할 메서드를 결정합니다. 어셈블리는 별도의 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 클래스의 새 인스턴스를 만들 필요가 있지만,이 인스턴스 생성은 이미로드 된 어셈블리를 기반으로 할 수 있습니다.
저는 질문을 추가하고 싶습니다 : 주어진 어셈블리에 대한 어셈블리 객체를 생성하려면 무거운 반향이 필요하며 어셈블리가로드되었는지 여부와 상관없이 항상 비싸지 않습니까?
CLR은 이미이 작업을 수행합니다. –
@ 한스 : 내 편집 내용을 살펴 보겠습니다. 질문에 추가 되었습니까? 귀하의 진술을 변경합니까? 로드 된 모든 어셈블리에는 새 인스턴스를 만드는 대신 단순히'LoadFrom'에 의해 반환되는 정적'Assembly' 객체가 할당되어 있습니까? – Slauma
아니요, CLR은 여전히이 작업을 수행합니다. –