Я пишу службу Windows, которая может передавать файлы с использованием различных методов: i.e email, 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