2012-08-27 4 views
0

우리 애플리케이션 (.NET, WinForms 3.5)을위한 간단한 플러그인 프레임 워크를 디자인해야합니다.플러그인 클래스를 인스턴스화하지 않고 플러그인 등록

확장 점은 사용자가 플러그인을 사용하여 특정 작업을 수행 할 수있는 여러 가지 응용 프로그램 이벤트/시나리오입니다. 내가 일이 싶습니다

방법은 다음과 같습니다

  1. 사용자가 플러그인 DLL을 (특정 기본 클래스에서 파생 된 형식/어떻게 든 표시를 포함하는 어셈블리)를 배치하는 플러그인 폴더 되세요.

  2. 내 응용 프로그램 플러그인 시스템에서 이러한 파일을 찾아 나중에 사용하도록 등록하십시오.

  3. 올바른 시점 (예 : OnException, OnLog 등)에서 올바른 플러그인을 호출하십시오.

등록 할 때 플러그인 객체 (새 프로그램)를 만들면 DLL이 프로세스 메모리에로드됩니다.

나는 등록을 쉽게 할 수있는 방법을 찾고 있는데, 필요한 경우 (필요할 경우) 플러그인 어셈블리를 "느슨하게"만로드합니다.

+0

아마도 주제에서 벗어나지 만, 왜 지연된 플러그인을로드하려고합니까? 시작 시간의 두 번째 또는 두 자신을 저장하는 것은 가치있는 IMHO처럼 보이지 않습니다. –

답변

1

당신이 할 수있는 경우, 각 플러그인이 자신을 설명하는 매니페스트 또는 다른 파일을 제공하도록 요구할 수 있습니다. 그러면 모든 매니페스트를 검사하고 필요할 때 적절한 플러그인을로드 할 수 있습니다. 이렇게하면 어셈블리를 검사 할 필요가 없지만 매니페스트와 어셈블리간에 일관성이 필요합니다. 까다로울 수 있습니다.

표시된대로 플러그인 어셈블리를 검사하면 메모리에로드됩니다. 이 문제를 피하기 위해 발견 한 유일한 방법은 별도의 AppDomain에로드하고 필요한 정보를 캡처 한 다음 언로드하는 것입니다. AppDomain PRISM을 위해 어딘가에 이것을 수행하는 예가 있습니다 (추적 할 수는 있습니다). 그러나 어떤 프레임 워크를 사용하고 있는지 잘 모르겠습니다 (MEF, MAF, PRISM, IoC 등).

1

각 후보 어셈블리를 새 AppDomain에로드하고 대신 해당 형식을 반영하고 마지막으로 AppDomain을 언로드하는 대신 Mono.Cecil을 시도해 볼 수 있습니다. 당신은 다음과 같이 뭔가를해야 할 것 :

AssemblyDefinition ad = AssemblyDefinition.ReadAssembly(assemblyPath); 

foreach (TypeDefinition td in ad.MainModule.GetTypes()) 
{ 
    if (td.BaseType != null && td.BaseType.FullName == "MyNamespace.MyAddInBase") 
    {   
     return true; 
    } 
} 

는 그런 다음 Assembly.LoadForm를 사용하여 올바른 어셈블리를로드 그리고 마지막으로 사용자의 요구에 맞는 Activator.CreateInstance 오버로드를 사용하여 추가 기능의 인스턴스를 만들 수 있습니다.

관련 문제