如何正确加载程序集

时间:2014-04-15 12:33:41

标签: c# .net reflection .net-assembly

我开发了一个带有插件的系统,它在运行时加载程序集。我有一个通用的接口库,我在服务器和它的插件之间共享。但是,当我执行LoadFrom for plugin文件夹并尝试查找实现公共接口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);
}

我该如何处理这个麻烦?

我会感激任何帮助

2 个答案:

答案 0 :(得分:3)

检查问题DLL及其依赖项。有可能它从不同版本的.NET中引入ServerCore.dll而不是主应用程序。

如果你想插件,我建议你使用MEF

答案 1 :(得分:0)

好吧,我的解决方案很难看,但是有效,我将来会继续为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);