C#Windows服务使用反射插件程序集

时间:2013-08-20 12:52:13

标签: c# reflection assemblies

我正在编写一个可以使用各种方法传输文件的Windows服务,例如email,ftp。 每个文件或文件集都可以有自己的配置详细信息。

对于生成后需要传递的每个文件或文件集,我想创建一个可以放在文件夹中的程序集,服务将在下次计划的运行时将其选中。该程序集使用标准接口来定义文件或文件集的传递方法。这些插件程序集可能需要引用其他依赖程序集,即需要包含在文件夹中的外部ftp库或电子邮件库,以及我必须删除插件程序集。

我的问题:有没有办法忽略插件程序集所在的文件夹中的依赖程序集?或者有没有办法分别在一个文件夹及其依赖程序集中组织插件程序集?

这是我的代码,其中服务循环通过程序集。目前它将使用文件夹中的所有内容,可能会抛出异常:

foreach (var file in Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigurationManager.AppSettings["AssemblyStorage"])))
{
      var assembly = Assembly.LoadFrom(file);

      Type type = assembly.GetType("ReflectionTest.Plugin");

      if (type != null)
      {
          object obj = Activator.CreateInstance(type);
          var resultFtp = type.InvokeMember("FTP", BindingFlags.Default | BindingFlags.InvokeMethod, null,obj, null);
          var resultEmail = type.InvokeMember("Email",BindingFlags.Default | BindingFlags.InvokeMethod,null, obj, null);

          Console.Write(resultFtp);
          Console.Write(resultEmail);

          obj = null;
      }

      assembly = null;
      type = null;

}

插件程序集:已编译的插件dll最终将驻留在上述文件夹中 - (Path.Combine(AppDomain.CurrentDomain.BaseDirectory,ConfigurationManager.AppSettings["AssemblyStorage"])。这些插件程序集文件名可以是任何内容。

namespace ReflectionTest
{
    public class Plugin : ITransferService
    {
        public bool FTP()
        {
            return true;
        }

        public bool Email()
        {
            return true;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

选项1.您可以使用特殊属性标记插件程序集,然后在枚举所有类型之前检查它。要在程序集上放置属性,可以在该程序集的任何代码文件中编写:

[assembly:YourSpecialAttributeClass]

选项2.您还可以尝试在不同的文件夹中分离程序集,并挂钩到AppDomain.AssemblyResolve事件,在插件和依赖项文件夹中手动搜索所需的程序集。