在我的应用程序中,我有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.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方法但没有成功。
有关如何使用所有依赖项加载程序集然后创建实例的任何想法吗?
答案 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;
不包括错误检查。
可以从任何路径加载实际程序集,上面的示例从当前工作目录加载它。您也可以从嵌入式资源加载它。