2010-06-24 2 views
1

Я хотел бы создать службу окон, которая может загружать несколько DLL из определенного места и публиковать их с помощью Remoting на определенном TCP-порту (скажем, 9000).C# Windows Service and Remoting

Каждая DLL содержит один класс, который будет опубликован.

Например (test.dll)

namespace Test 
{ 
    class Service 
    { 
    // methods here 
    } 
} 

Служба должна опубликовать его с помощью Remoting tcp://<servername>:9000/Test.dll

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

Может быть, есть еще один способ сделать это?

ответ

0

Если вы ищете надежное решение, изучите MEF, Managed Extensibility Framework.

Если, однако, вы просто хотите, чтобы загрузить DLL, как простые плагины, у меня есть некоторые примеры кода из моей TournamentApi:

/// <summary> 
/// Provides methods to load plugins from external assemblies. 
/// </summary> 
public static class PluginLoader 
{ 
    ... 

    /// <summary> 
    /// Loads the plugins from a specified assembly. 
    /// </summary> 
    /// <param name="assembly">The assembly from which to load.</param> 
    /// <returns>The plugin factories contained in the assembly, if the load was successful; null, otherwise.</returns> 
    public static IEnumerable<IPluginFactory> LoadPlugins(Assembly assembly) 
    { 
     var factories = new List<IPluginFactory>(); 

     try 
     { 
      foreach (var type in assembly.GetTypes()) 
      { 
       IPluginEnumerator instance = null; 

       if (type.GetInterface("IPluginEnumerator") != null) 
       { 
        instance = (IPluginEnumerator)Activator.CreateInstance(type); 
       } 

       if (instance != null) 
       { 
        factories.AddRange(instance.EnumerateFactories()); 
       } 
      } 
     } 
     catch (SecurityException ex) 
     { 
      throw new LoadPluginsFailureException("Loading of plugins failed. Check the inner exception for more details.", ex); 
     } 
     catch (ReflectionTypeLoadException ex) 
     { 
      throw new LoadPluginsFailureException("Loading of plugins failed. Check the inner exception for more details.", ex); 
     } 

     return factories.AsReadOnly(); 
    } 
} 

Это занимает загруженную сборку и инициализирует экземпляр каждого IPluginEnumerator в сборе и он возвращает каждый IPluginFactory (абстрактный завод), который он поддерживает.

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