使用从属引用加载程序集

时间:2018-06-05 06:58:30

标签: c# reflection

在我的应用程序中,我有interface名为IPlugin。此interface用于标识Plugin文件夹中的dll,并在应用程序启动时加载它们。

IPlugin界面如下所示:

public interface IPlugin
{
  string Name { get; }

  void Initialize();
}

在我的主应用程序中,我使用以下代码加载位于Plugins-folder中的所有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.Interface
  • Users.Plugin

Users.Plugin具有对Users.Interface的引用。在Users.Plugin中有一个IPlugin的实现。所以Users.Plugin-Dll将被识别为由我的LoadPlugins-Method加载。

现在我在第:

行获得带有Users.Plugin-File的ReflectionTypeLoadException
Type targetType = assembly.GetTypes().FirstOrDefault(type => type.GetInterfaces().Contains(typeof(IPlugin)));

LoaderException告诉我,无法找到程序集Users.Interface或引用。

我尝试使用Assembly.LoadFrom(...),但这也不起作用。

我也试过this方法但没有成功。

有关如何使用所有依赖项加载程序集然后创建实例的任何想法吗?

1 个答案:

答案 0 :(得分:1)

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

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;

不包括错误检查。

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