2013-08-20 2 views
0

저는 이메일, ftp와 같은 다양한 방법을 사용하여 파일을 전송할 수있는 Windows 서비스를 작성하고 있습니다. 각 파일 또는 파일 세트는 고유 한 구성 세부 사항을 가질 수 있습니다.C# Windows 플러그인 서비스 플러그인을 사용하는 서비스

생성 된 후에 배달해야하는 모든 파일 또는 파일 세트에 대해 폴더에 놓을 수있는 어셈블리를 만들고 서비스가 다음 예약 된 실행시에 가져옵니다. 이 어셈블리는 파일 또는 파일 세트의 전달 방법을 정의하는 표준 인터페이스를 사용합니다. 이 플러그인 어셈블리는 다른 종속 어셈블리, 즉 외부 ftp 라이브러리 또는 폴더에 포함될 필요가있는 전자 메일 라이브러리를 참조해야 할 수도 있습니다.이 라이브러리는 플러그인 어셈블리를 삭제해야하는 곳입니다.

내 질문에 : 플러그인 어셈블리가있는 폴더에서 종속 어셈블리를 무시하는 방법이 있습니까? 아니면 하나의 폴더에 플러그인 어셈블리를 구성하고 종속 어셈블리를 별도로 구성하는 방법이 있습니까?

여기 내 코드에서 어셈블리를 통해 서비스 루프가 발생합니다. 현재이 폴더에 모든 것을 사용합니다 아마 예외가 발생합니다 :

foreach (var file in Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigurationManager.AppSettings["AssemblyStorage"]))) 
{ 
     var assembly = Assembly.LoadFrom(file); 

     Type type = assembly.GetType("ReflectionTest.Plugin"); 

     if (type != null) 
     { 
      object obj = Activator.CreateInstance(type); 
      var resultFtp = type.InvokeMember("FTP", BindingFlags.Default | BindingFlags.InvokeMethod, null,obj, null); 
      var resultEmail = type.InvokeMember("Email",BindingFlags.Default | BindingFlags.InvokeMethod,null, obj, null); 

      Console.Write(resultFtp); 
      Console.Write(resultEmail); 

      obj = null; 
     } 

     assembly = null; 
     type = null; 

} 

플러그인 어셈블리 :가 컴파일 된 플러그인 DLL이 결국 위에서 언급 한 폴더에 상주 - (Path.Combine(AppDomain.CurrentDomain.BaseDirectory,ConfigurationManager.AppSettings["AssemblyStorage"]). 이 플러그인 어셈블리 파일 이름은 무엇이든 될 수 있습니다.

namespace ReflectionTest 
{ 
    public class Plugin : ITransferService 
    { 
     public bool FTP() 
     { 
      return true; 
     } 

     public bool Email() 
     { 
      return true; 
     } 
    } 
} 
+0

이것은 MEF의 완벽한 후보자처럼 들립니다. http://msdn.microsoft.com/en-us/library/dd460648.aspx –

+0

플러그인 어셈블리의 이름에 규칙을 적용하지 않는 이유는 무엇입니까? 이렇게하면 종속 어셈블리를 필터링 할 수 있습니다. – Bond

답변

0

옵션 1. 당신은 당신이 쓸 수있는 특별한 속성과 플러그인 어셈블리를 표시 한 후 해당 어셈블리의 코드 파일에서 어셈블리에 속성을 넣어 types.To을 모두 열거하기 전에 확인할 수 있습니다

[assembly:YourSpecialAttributeClass] 

옵션 2 다른 폴더에서 어셈블리를 분리하고 AppDomain.AssemblyResolve 이벤트에 후크하여 수동으로 필요한 플러그 인 및 종속성 어셈블리를 검색 할 수 있습니다.