实例化一个类在Assembly.GetTypes()处生成ReflectionTypeLoadException

时间:2014-10-27 15:41:23

标签: c# asp.net reflection asp.net-web-api telerik-reporting

我发现我的应用程序生成Telerik报告后

var result = new ReportProcessor().RenderReport("PDF", new InstanceReportSource { ReportDocument = new MyTelerikReport(data) }, null);
var stream = new MemoryStream(result.DocumentBytes);

return CreateHttpFileResponse("MyReport.pdf", stream, "application/pdf");

我无法在CurrentDomain

中获得所有类型
var typesWithAttribute = (from a in AppDomain.CurrentDomain.GetAssemblies()
                          from t in a.GetTypes() //error appears here
                          //some filtering logic
                          select t).ToList();

我收到错误

  

System.Reflection.ReflectionTypeLoadException:无法加载一个或   更多请求的类型。检索LoaderExceptions属性   了解更多信息。

LoaderExceptions:

  

System.IO.FileNotFoundException:无法加载文件或程序集   'DocumentFormat.OpenXml,Version = 2.0.5022.0,Culture = neutral,   PublicKeyToken = 31bf3856ad364e35'或其依赖项之一。该   系统找不到指定的文件。文件名:   'DocumentFormat.OpenXml,Version = 2.0.5022.0,Culture = neutral,   公钥= 31bf3856ad364e35'

经过一些调查后,我发现无法加载的程序集Telerik.Reporting.OpenXmlRendering, Version=8.0.14.311, Culture=neutral, PublicKeyToken=a9d7983dfcc261be并且在生成报表之前AppDomain.CurrentDomain.GetAssemblies()中的程序集不存在(我假设程序集由Telerik.Reporting, Version=8.0.14.311, Culture=neutral, PublicKeyToken=a9d7983dfcc261be动态加载)。

我可以过滤掉那个程序集,因为我不需要任何类型,但我有点担心在域中组装无法加载的事实 - 对我来说似乎有点不对。

有人可以解释会发生什么吗?这是我的问题还是第三方库的错误,它没有加载所有必需的程序集?

1 个答案:

答案 0 :(得分:2)

问题不是程序集,而是Type来自尚未加载的依赖程序集。

  

如果在程序集上调用GetTypes方法,并且该程序集中的类型依赖于尚未加载的程序集中的类型(例如,如果它派生自第二个程序集中的类型),则ReflectionTypeLoadException为抛出。

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes(v=vs.110).aspx