2016-07-30 93 views
0

我试图构建一个插件体系结构,其中的dll包含在zip文件中,解压缩,存储,然后加载,以便特定类型可以被构建和使用。理论上,这听起来可行。但是我遇到了问题。我不断收到如何使用C#加载程序集并获取其中的所有类型(不包含ReflectionTypeLoadException)

ReflectionTypeLoadException。

这里就是我有一个不工作:

 var dlls = pluginFiles.Where(p => p.Value.FileInfo.Extension.ToLower() == ".dll").ToList(); 
     int num = 0; 
     foreach(var dll in dlls){ 
      var assembly = Assembly.LoadFile (dll.Value.FileInfo.FullName); 
      var pluginTypes = assembly.GetTypes().Where (p => p.IsSubclassOf (typeof (Plugin))); 
      foreach(var pluginType in pluginTypes){ 
       var ctor = pluginType.GetConstructors().FirstOrDefault(); 
       if (ctor == null) continue; 
       var plugin = (Plugin)ctor.Invoke (new object [] { }); 
       if (plugin == null) continue; 
       num++; 
       _mgr.RegisterNew (plugin); 
      }      
     } 

正如我在调试步进通过这个,异常发生在那里我运行assembly.GetTypes()行。

我在这里做错了什么?我应该做一些新的AppDomain吗?

更多信息:我正在加载的程序集是一个测试程序集。它确实提到了FakeItEasy。它有一个班级,这是我正在寻找的班级。那个特定的类是另一个类的子类,它在我的调用类引用的程序集中...看起来很混乱。让我这样解释:

装配1:核心,装配2:Dummy_assembly,装配3:测试。

  • 测试和dummy_assembly参考核心。
  • Dummy_assembly是我压缩并试图解压,加载,然后搜索的dll。
  • 测试是我调用上面显示的方法的程序集。
  • 上面显示的代码位于Core中。

我看了看this。它似乎可能适用,但我不能完全说明(我不太明白为什么这个答案适用于这个问题)。

回答

0

如果程序集包含无法加载的类型,则会抛出(通常是因为在无法解析的程序集引用上)......对此无能为力。

但是你可以捕捉异常并检查Types属性并获取可以成功加载的类型。

https://msdn.microsoft.com/en-us/library/system.reflection.reflectiontypeloadexception.types(v=vs.110).aspx

如果您在另一个目录中引用的DLL,你也可以处理AppDomain.AssemblyResolve事件和自己处理。

+0

什么会处理它自己看起来像? –

+0

https://msdn.microsoft.com/zh-cn/library/ff527268(v=vs.110).aspx – Jeff

0

围绕gettypes代码添加try/catch块。确保在某处无法加载程序集以进行调试。

相关问题