使用插件程序集反射的C#Windows服务
我正在编写一个windows服务,可以使用各种方法传输文件,如电子邮件、ftp。 每个文件或文件集都可以有自己的配置详细信息 对于生成后需要交付的每个文件或文件集,我希望创建一个可放入文件夹中的程序集,服务将在下一次计划运行时提取它。此程序集使用标准接口定义一个或多个文件集的传递方法。这些插件程序集可能需要引用其他依赖程序集,即外部ftp库或电子邮件库,这些程序集需要包含在我必须放置插件程序集的文件夹中 我的问题:是否有办法忽略插件程序集所在文件夹中的依赖程序集?或者有没有一种方法可以将插件程序集分别组织在一个文件夹中及其依赖程序集 下面是我的代码,其中服务循环通过程序集。目前,它将使用文件夹中的所有内容,并可能引发异常:使用插件程序集反射的C#Windows服务,c#,reflection,assemblies,C#,Reflection,Assemblies,我正在编写一个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;
}
}
}
选项1.您可以使用特殊属性标记插件程序集,然后在枚举所有类型之前进行检查。要在程序集上添加属性,可以在该程序集的任何代码文件中编写:
[assembly:YourSpecialAttributeClass]
选项2.您还可以尝试分离不同文件夹中的程序集,并挂接到AppDomain.AssemblyResolve事件,在plugins and dependencies文件夹中手动搜索所需的程序集。这听起来像是MEF的完美候选。为什么不在插件程序集的名称上引入约定。这样,您就可以过滤er输出依赖程序集。