0

我正在编写一个可以使用各种方法传输文件的 Windows 服务,例如电子邮件、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;
        }
    }
}
4

1 回答 1

0

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

[assembly:YourSpecialAttributeClass]

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

于 2013-08-20T13:01:48.313 回答