我正在应用程序中实现一个简单的插件架构。插件要求是使用应用程序和插件引用的 *.dll 中的接口 (IPlugin) 定义的。该应用程序有一个插件管理器(也在同一个 *.dll 中),它通过在插件文件夹中查找所有 *.dll 来加载插件,加载它们,然后检查插件是否实现了接口。我已经通过两种不同的方式进行了此检查[以前通过简单的 if (plugin is IPlugin)],但是当插件实现接口时,没有人会识别。这是代码:
Assembly pluginAssembly = Assembly.LoadFrom(currFile.FullName);
if (pluginAssembly != null)
{
foreach (Type currType in pluginAssembly.GetTypes())
{
if (currType.GetInterfaces().Contains(typeof(IPlugin)))
{
// Code here is never executing
// even when the currType derives from IPlugin
}
}
}
我曾经测试一个特定的类名(“插件”),但后来我让它循环遍历程序集中的所有类,但无济于事。(下面是我在其他地方找到的一个示例。)为了使这个更复杂一点,有两个接口,每个接口都实现了原始接口(IPluginA,IPluginB)。该插件实际上实现了更具体的接口之一(IPluginB)。但是,我已经尝试使用仅实现更通用接口(IPlugin)的插件,但这仍然不起作用。
[编辑:针对我第一次收到的两个回复] 是的,我尝试过使用 IsAssignableFrom。请参阅以下内容:
Assembly pluginAssembly = Assembly.LoadFrom(currFile.FullName);
if (pluginAssembly != null)
{
foreach (Type currType in pluginAssembly.GetTypes())
{
if (typeof(IPlugin).IsAssignableFrom(currType))
{
string test = "test";
}
}
}