调用Assembly.GetTypes()时抛出ReflectionTypeLoadException

时间:2014-05-15 17:28:03

标签: c# .net asp.net-mvc asp.net-mvc-5

我最近升级到ASP.Net MVC 5,升级后我的代码不再运行。

我通过反映当前AppDomain中的类型来执行插件加载。

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
IEnumerable<Type> types = assemblies.SelectMany(o => o.GetTypes()).ToList(); // <-- Throws error

我在Microsoft.Web.Mvc程序集上收到错误:

  

无法加载一个或多个请求的类型。检索   LoaderExceptions属性以获取更多信息。

并且在检索加载器异常时,我得到以下内容:

  
      
  • [0] {System.TypeLoadException:覆盖成员时违反了继承安全规则:&#39; Microsoft.Web.Mvc.CreditCardAttribute.GetClientValidationRules(System.Web.Mvc.ModelMetadata,System.Web.Mvc.ControllerContext)& #39 ;.重写方法的安全性可访问性必须与被覆盖的方法的安全性可访问性相匹配。} System.Exception {System.TypeLoadException}
  •   
  • [1] {System.TypeLoadException:覆盖成员时违反了继承安全规则:&#39; Microsoft.Web.Mvc.EmailAddressAttribute.GetClientValidationRules(System.Web.Mvc.ModelMetadata,System.Web.Mvc.ControllerContext)& #39 ;.重写方法的安全性可访问性必须与被覆盖的方法的安全性可访问性相匹配。} System.Exception {System.TypeLoadException}
  •   
  • [2] {System.TypeLoadException:重写成员时违反了继承安全规则:&#39; Microsoft.Web.Mvc.FileExtensionsAttribute.GetClientValidationRules(System.Web.Mvc.ModelMetadata,System.Web.Mvc.ControllerContext)& #39 ;.重写方法的安全性可访问性必须与被覆盖的方法的安全性可访问性相匹配。} System.Exception {System.TypeLoadException}
  •   
  • [3] {System.TypeLoadException:违反类型的继承安全规则:&#39; Microsoft.Web.Mvc.CookieValueProviderFactory&#39;。派生类型必须与基类型的安全可访问性匹配,或者不太容易访问。} System.Exception {System.TypeLoadException}
  •   
  • 等等...
  •   

我知道MVC团队删除了AllowPartialTrustedCallers程序集属性。这是一个重大变化http://www.asp.net/visual-studio/overview/2013/release-notes#knownissues。我的web.config设置为完全信任,但仍然没有。

任何想法??

1 个答案:

答案 0 :(得分:2)

看起来你正在使用一些MVC 4 DLL。

  

请注意,作为此的副作用,您无法在同一应用程序中使用4.0和5.0程序集。您需要将所有这些更新为5.0。

可能您需要查看并查看哪些程序集正在尝试加载为4个版本。

这是一个问题的原因是MVC 4程序集归属于AllowPartialTrustedCallers,但MVC 5程序集没有。

由于MVC 5 DLL具有MVC 4 DLL的基类,因此MVC 4 DLL需要对其类具有相同或更严格的权限。由于它没有(这就是为什么这是一次重大改变)安全系统失败了。

另请注意,这是一个运行时错误,部分原因是构建的版本没有此问题(您正在有效地交换新的基类)。

相关问题