在我的申请中
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
接近没有成功。
有什么想法可以加载具有所有依赖项的程序集,然后创建一个实例吗?