2011-02-13 94 views
2

当我在ASP.NET MVC 3.0项目中引用Microsoft.Web.Mvc.dll时,出现错误,当我在构建DirecotryCatalog我的CustomDependencyResolverASP.NET MVC 3.0 + Microsoft.Web.Mvc 3.0 + MEF兼容性

string path = HostingEnvironment.MapPath("~/bin"); 
var container = new DirectoryCatalog(path); 

然后我看着container.Parts.Results View.LoadedExeptions和跟它:

+ [0] {“方法 'GetControllerSessionBehavior' 从组件类型 'Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory'“Microsoft.Web .Mvc,版本= 3.0.0.0,文化=中立,公钥=空”没有实现。 “:” Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory“} {System.Exception的} System.TypeLoadException

+ [1] {“组件'Microsoft.Web.Mvc,版本= 3.0.0.0,Culture = neutral,PublicKeyToken = null'类型为'Microsoft.Web.Mvc.Resources.ResourceControllerFactory'中的Method'GetControllerSessionBehavior'没有的实施方式。 “:” Microsoft.Web.Mvc.Resources.ResourceControllerFactory“} {的System.Exception} System.TypeLoadException

只是为了测试我删除参考Microsoft.Web.Mvc.dll(物理上除去它斌direcotry),然后一切都很好。看起来像Microsoft.Web.Mvc.dll无法加载。

有什么解决办法吗?

我在这里发现了类似的问题http://forums.asp.net/t/1622399.aspx?MVC+3+RC.+Where+is+the+Futures+Assembly%3F回答说MVC 3 Beta期货+ MVC 3 RC Runtime =是不兼容的。但我同时使用RTM版本:

Microsoft.Web.Mvc运行时版本v4.0.30319,版本3.0.0.0(从这里下载http://mvccontrib.codeplex.com/releases/view/59313

System.Web.Mvc运行V4版本。 0.30319,版本3.0.0.0

更新:

正如达林·季米特洛夫在他的回答,我需要从扫描过程中排除System.Web.Mvc menthioned。 这里是怎样的方式来做到这一点:

public class SafeDirectoryCatalog : ComposablePartCatalog 
{ 
    private readonly AggregateCatalog _catalog; 

    public SafeDirectoryCatalog(string directory) 
    { 
     var files = Directory.EnumerateFiles(directory, "*.dll", SearchOption.AllDirectories); 

     _catalog = new AggregateCatalog(); 

     foreach (var file in files) 
     { 
      try 
      { 
       var asmCat = new AssemblyCatalog(file); 

       //Force MEF to load the plugin and figure out if there are any exports 
       // good assemblies will not throw the RTLE exception and can be added to the catalog 
       if (asmCat.Parts.ToList().Count > 0) 
        _catalog.Catalogs.Add(asmCat); 
      } 
      catch (ReflectionTypeLoadException) 
      { 
      } 
     } 
    } 
    public override IQueryable<ComposablePartDefinition> Parts 
    { 
     get { return _catalog.Parts; } 
    } 
} 

回答

4

MEF电抗器,因为它扫描所有组件中包含接口和类和MvcDynamicSessionControllerFactory类,它实现IControllerFactory恰好是密封bin文件夹。所以我在这里看到的唯一解决方案是从扫描进程中排除Microsoft.Web.Mvc程序集。我不熟悉MEF,但在具有相同问题的StructureMap中,您可以排除类型。

+0

你是对的,我需要排除这个组件 – Kuncevic 2011-02-27 05:11:33

0

未来,当您尝试从多个位置加载相同的程序集时,它可能会帮助其他人知道您也可以得到此异常。

在我的情况下,我改变了我正在处理的插件程序集的构建放置位置,而没有从之前的位置清除它。结果,应用程序从两个位置加载相同的程序集并删除此异常。清理build drop解决了这个问题。

SafeDirectoryCatalog是有用/方便的不会崩溃您的应用程序,但MEF仍然不会加载您的程序集。