Как запустить несколько версий кода из одной службы Windows в .NET? - PullRequest
1 голос
/ 14 марта 2011

У нас есть корпоративное приложение ASP.NET/VB.NET, в котором несколько клиентов работают на разных версиях (веб-сайтах) кода продукта.

Я пытаюсь создать службу Windows, которая работает нанаш сервер для выполнения длительных задач.Эта служба должна запускать правильную версию кода для каждого клиента, и я изначально думал о вызове службы WCF, которая будет развернута как часть веб-версии.

Проблема заключается в том, что наши пулы IIS перезагружаются каждую ночьи это открывает возможность прерывания работы.Работа, продолжавшаяся более 24 часов, никогда не получит возможность завершить.

Наш сервер работает под управлением Windows Server 2003, IIS 6.0, .NET Framework 3.5, SQL Server 2005.

Есть ли способдинамически загружать сборки для использования без перезапуска службы?

Редактировать : я закончил с использованием System.AddIn, подробно описанным в этом пошаговом примере

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Есть ли способ загружать сборки динамически для использования без необходимости перезапуска службы?

Да, есть.Я полагаю, у вас есть один или несколько типов, которые должны быть созданы.Если это ваш случай, попробуйте использовать что-то вроде этого:

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);
}
0 голосов
/ 14 марта 2011

Есть ли способ загрузки сборок? динамически использовать без необходимости перезапустить службу?

Возможно, вы могли бы спроектировать архитектуру плагинов для своей службы, а затем загрузить различные плагины для выполнения различных задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...