Есть ли способ загружать сборки динамически для использования без необходимости перезапуска службы?
Да, есть.Я полагаю, у вас есть один или несколько типов, которые должны быть созданы.Если это ваш случай, попробуйте использовать что-то вроде этого:
object instance = Activator.CreateInstance("MyAssembly.dll", "MyType");
instance.GetType().InvokeMethod(etc);
Если вы работаете в .NET Framework 4.0, вы можете использовать DLR:
dynamic instance = Activator.CreateInstance("MyAssembly.dll", "MyType");
instance.MyMethod();
РЕДАКТИРОВАТЬ: В качестве альтернативы вы можете взглянуть на MEF (это часть .NET Framework 4.0).
MEF представляет простое решение проблемы расширяемости среды выполнения.
В основном ( Я значительно упрощаю ) вы можете указать, какая папка имеетбыть выбранным для принятия сборок, а затем MEF автоматически создаст экземпляры объектов, которые, например, совместно используют один и тот же интерфейс.
Общий интерфейс:
public interface IPlugin
{
void ExecuteTask();
}
Плагин (внешняя сборка):
[Export(typeof(IPlugin)]
public class Plugin1 : IPlugin
{
public void ExecuteTask()
{
// Do something
}
}
Основное применение:
[Import]
private IPlugin plugin;
// Somewhere else
private void Initialize()
{
var directory = new DirectoryCatalog("myDir");
var container = new CompositionContainer(directory);
container.ComposeParts(this);
}