2013-08-20 64 views
0

我正在寫一個Windows服務,可以使用各種方法,即電子郵件,FTP傳輸文件。 每個文件或文件集都可以有自己的配置細節。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事件中,在插件和依賴項文件夾中手動搜索所需的程序集。