我正在寫一個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;
}
}
}
這聽起來像是MEF的完美人選。 http://msdn.microsoft.com/en-us/library/dd460648.aspx –
爲什麼不引入一個關於插件程序集名稱的約定。這樣你就可以過濾出相關的程序集。 – Bond