可以在不使用接口的情况下加载程序集吗

本文关键字:情况下 加载 程序集 接口 | 更新日期: 2023-09-27 18:21:04

我设置了一个依赖于使用接口的小型插件系统。但我发现接口无法序列化,我的整个存储系统都依赖于序列化文件,这些文件将包含这些插件。

所以我决定把接口换成一个抽象类。效果很好。但我目前的解决方案似乎需要一个接口。

程序集的类型仅显示null和Resources。所以我只是猜测,以这种方式加载程序集不能用抽象类完成?有没有一种不使用接口的方法?

public List<EnginePluginBase> GetEnginePlugins(string directory)
{
    if (string.IsNullOrEmpty(directory))
        return null;
    List<EnginePluginBase> plugins = new List<EnginePluginBase>();
    foreach (FileInfo file in new DirectoryInfo(directory).GetFiles("*.dll"))
    {
        Assembly currentAssembly = Assembly.LoadFile(file.FullName);
        foreach (Type type in GetTypesLoaded(currentAssembly))
        {
            if (type != typeof(EnginePluginBase))
                continue;
            EnginePluginBase plugin = (EnginePluginBase)Activator.CreateInstance(type);
            plugins.Add(plugin);
        }
    }
    return plugins;
}
private Type[] GetTypesLoaded(Assembly assembly)
{
    Type[] types;
    try
    {
        types = assembly.GetTypes();
    }
    catch (ReflectionTypeLoadException e)
    {
        types = e.Types.Where(t => t != null).ToArray();
    }
    return types;
}

可以在不使用接口的情况下加载程序集吗

您的GetTypesLoaded似乎太宽容了,只有例外:如果加载类型中存在异常,则需要了解原因。尝试检查您得到的异常(e.LoaderExceptions是一个很好的候选者)

正如我在评论中所说,修改您要查找的类型的复选框:更改

if (type != typeof(EnginePluginBase)) 
    continue;

if (! typeof(EnginePluginBase).IsAssignableFrom(type))
    continue;

这应该适用于抽象基类(EnginePluginBase)或接口(如IEnginePlugin

此外,它还适用于非直接从EnginePluginBase继承的类型,即从继承自EnginePluginBase(或实现IEnginePlugin)的另一个类继承的类

type !=typeof(EnginePluginBase)更改为type.BaseType !=typeof(EnginePluginBase)作为它的基类也不确定GetTypesLoaded是什么方法。这是我使用的代码,对我有效,我认为应该对你有效。

Assembly asm = null;
asm = Assembly.LoadFrom(strProtocolDll);
 Type[] assemblyTypes = asm.GetTypes();
  foreach (Type module in assemblyTypes)
   {
     if (typeof(ProtocolBase) == module.BaseType)
        {
            return (ProtocolBase)Activator.CreateInstance(module);
        }
    }