C # Windows Service и Remoting - PullRequest
       4

C # Windows Service и Remoting

1 голос
/ 24 июня 2010

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

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

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

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

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

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

Может быть, есть другой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 24 июня 2010

Для этого можно использовать множество методов в классе Assembly, они загружаются в домен приложений, который будет выгружен вместе со службой, когда вы ее остановите.

Выезд: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.loadfile.aspx

0 голосов
/ 24 июня 2010

Вы можете легко загружать сборки в .NET Framework.Взгляните на метод Load класса Assembly, чтобы узнать, как это сделать:

http://msdn.microsoft.com/en-us/library/xbe1wdx9%28v=VS.71%29.aspx

0 голосов
/ 24 июня 2010

Если вы ищете надежное решение, загляните в 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 для остальной части кода.

...