【问题标题】:C# Windows Service using reflection for plugin assembliesC# Windows 服务使用插件程序集的反射
【发布时间】:2013-08-20 12:52:13
【问题描述】:

我正在编写一个 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;
        }
    }
}

【问题讨论】:

标签: c# reflection assemblies


【解决方案1】:

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

[assembly:YourSpecialAttributeClass]

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

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多