代码之家  ›  专栏  ›  技术社区  ›  Tomtom

使用依赖引用加载程序集

  •  1
  • Tomtom  · 技术社区  · 8 年前

    在我的申请中 interface 打电话 IPlugin . 这个 接口 用于标识插件文件夹中的dll并在应用程序启动时加载它们。

    这个 插件接口 界面看起来像:

    public interface IPlugin
    {
      string Name { get; }
    
      void Initialize();
    }
    

    在我的主应用程序中,我使用了以下代码来加载位于plugins文件夹中的所有dll文件:

    internal List<IPlugin> LoadPlugins()
    {
        List<IPlugin> plugins = new List<IPlugin>();
    
        foreach (string file in Directory.GetFiles("Plugins", "*.dll", SearchOption.TopDirectoryOnly))
        {
            Assembly assembly = Assembly.LoadFile(Path.GetFullPath(file));
            Type targetType = assembly.GetTypes().FirstOrDefault(type => type.GetInterfaces().Contains(typeof(IPlugin)));
            if (targetType != null)
            {
                IPlugin plugin = Activator.CreateInstance(targetType) as IPlugin;
                if (plugin != null)
                {
                    plugins.Add(plugin);
                }
            }
        }
        return plugins;
    }
    

    这只适用于不需要另一个dll的dll。

    现在我已经创建了一个有两个dll的插件。

    • 用户界面
    • 用户插件

    users.plugin引用了users.interface。在users.plugin中有一个 插件接口 . 因此users.plugin-dll将被标识为由我的loadplugins方法加载。

    现在我得到了 ReflectionTypeLoadException 在users.plugin-file行中:

    Type targetType = assembly.GetTypes().FirstOrDefault(type => type.GetInterfaces().Contains(typeof(IPlugin)));
    

    loadereException告诉我,找不到程序集users.interface或引用。

    我试着用 Assembly.LoadFrom(...) 但这也不管用。

    我也试过 this 接近没有成功。

    有什么想法可以加载具有所有依赖项的程序集,然后创建一个实例吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   PepitoSh    8 年前

    用于在运行时解析程序集的代码段:

    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
    
        String DllName = new AssemblyName(args.Name).Name + ".dll";
    
        return Assembly.LoadFile(DllName);
    }
    

    将其设置在插件初始值设定项的开头:

    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    

    不包括错误检查。

    实际的程序集可以从任何路径加载,上面的示例从当前工作目录加载它。您也可以从嵌入式资源加载它。