代码之家  ›  专栏  ›  技术社区  ›  Keeper

C#Windows服务和远程处理

  •  1
  • Keeper  · 技术社区  · 14 年前

    我想创建一个窗口服务,它可以从某个位置加载几个dll,并在特定的TCP端口(比如9000)上使用Remoting发布它们。

    例如(Test.dll)

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

    服务应该使用远程处理发布它 tcp://<servername>:9000/Test.dll

    我知道如何使用远程处理,但我想知道如何实现该服务,以便它可以在启动时动态加载DLL,并在停止时卸载它们。

    3 回复  |  直到 14 年前
        1
  •  0
  •   Lloyd    14 年前

    您可以使用Assembly类中的许多方法来实现这一点,它们被加载到AppDomain中,当您停止服务时,AppDomain将与服务一起卸载。

    退房: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.loadfile.aspx

        2
  •  0
  •   Joel Martinez    14 年前

    您可以轻松地在.NET framework中加载程序集。有关如何执行此操作的指导,请查看汇编类的Load方法:

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

        3
  •  0
  •   John Gietzen    14 年前

    MEF ,托管可扩展性框架。

    但是,如果您只想将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 (抽象工厂)它所支持的。