我开发了一个带有插件的系统,它在运行时加载程序集。我有一个通用的接口库,我在服务器和它的插件之间共享。但是,当我为插件文件夹执行LoadFrom并试图找到所有实现公共接口IServerModule
的类型时,我得到了运行时异常:
"ServerCore.IServerModule"类型同时存在于"ServerCore.dll"中和"ServerCore.dll"
我加载这样的插件:
foreach (var dll in dlls)
{
var assembly = Assembly.LoadFrom(dll);
var modules = assembly.GetExportedTypes().Where(
type => (typeof (IServerModule)).IsAssignableFrom(type)
&& !type.IsAbstract &&
!type.IsGenericTypeDefinition)
.Select(type => (IServerModule)Activator.CreateInstance(type));
result.AddRange(modules);
}
我该如何处理这个麻烦?
我将感谢
检查问题DLL及其依赖项。它很可能是从与您的主应用程序不同的.NET版本引入ServerCore.dll
的。
如果你想做插件,我建议你使用MEF。
好吧,我的解决方案很难看,但有效,我将来(也许)会继续使用MEF。现在,我添加了这样的东西:
if(Path.GetFileNameWithoutExtension(dll)==Assembly.GetCallingAssembly().GetName().Name)
continue;
感谢大家的精彩回复
编辑:我提出了一个更优雅的解决方案,在这里:
var frameworkAssemblies =
from file in new DirectoryInfo(frameworkDirectory).GetFiles()
where (file.Extension.ToLower() == ".dll" || file.Extension.ToLower() == ".exe")
&& !AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName().Name).Contains(file.GetFileNameWithoutExtension())
select Assembly.LoadFrom(file.FullName);