Asp.net mvc 3 ASP.NET MVC 3.0+;Microsoft.Web.Mvc 3.0+;MEF兼容性

Asp.net mvc 3 ASP.NET MVC 3.0+;Microsoft.Web.Mvc 3.0+;MEF兼容性,asp.net-mvc-3,mef,Asp.net Mvc 3,Mef,当我在ASP.NET Mvc 3.0项目中引用了Microsoft.Web.Mvc.dll时,我在我的CustomDependencyResolver中构建DirecotryCatalog时遇到了一个错误 string path = HostingEnvironment.MapPath("~/bin"); var container = new DirectoryCatalog(path); 然后我看了看container.Parts.Results View.LoadedExeption

当我在ASP.NET Mvc 3.0项目中引用了Microsoft.Web.Mvc.dll时,我在我的
CustomDependencyResolver
中构建
DirecotryCatalog
时遇到了一个错误

string path = HostingEnvironment.MapPath("~/bin");
 var container = new DirectoryCatalog(path); 
然后我看了看
container.Parts.Results View.LoadedExeptions
,它说:

+[0]{“程序集”Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory中类型为“Microsoft.Web.Mvc.MVCDynamicsSessionControllerFactory”的方法“GetControllerSessionBehavior”没有实现。”:“Microsoft.Web.Mvc.MVCDynamicsSessionControllerFactory”System.Exception{System.TypeLoadException}

+[1]{“程序集”Microsoft.Web.Mvc.Resources.ResourceControllerFactory中类型为“Microsoft.Web.Mvc.Resources.ResourceControllerFactory”的方法“GetControllerSessionBehavior”没有实现。”:“Microsoft.Web.Mvc.Resources.ResourceControllerFactory”System.Exception{System.TypeLoadException}

为了测试,我删除了对Microsoft.Web.Mvc.dll的引用(从bin目录中物理删除),然后一切都很好。看起来无法加载Microsoft.Web.Mvc.dll

附近有工作吗

我在这里发现了类似的问题,答案是MVC 3 Beta Futures+MVC 3 RC Runtime=不兼容。但我使用两种RTM版本:

Microsoft.Web.Mvc运行时版本v4.0.30319,版本3.0.0.0(从此处下载)

System.Web.Mvc运行时版本v4.0.30319,版本3.0.0.0

更新:

正如Darin Dimitrov在回答中提到的,我需要将System.Web.Mvc排除在扫描过程之外。 以下是如何做到这一点的方法:

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; }
    }
}
公共类SafeDirectoryCatalog:ComposablePartCatalog
{
专用只读聚合catalog目录;
公共安全目录目录(字符串目录)
{
var files=Directory.EnumerateFiles(目录“*.dll”、SearchOption.AllDirectories);
_catalog=新的AggregateCatalog();
foreach(文件中的var文件)
{
尝试
{
var asmCat=新装配目录(文件);
//强制MEF加载插件并确定是否有任何导出
//好的程序集不会引发RTLE异常,并且可以添加到目录中
如果(asmCat.Parts.ToList().Count>0)
_catalog.Catalogs.Add(asmCat);
}
捕获(ReflectionTypeLoadException)
{
}
}
}
公共可更换部件
{
获取{return\u catalog.Parts;}
}
}

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

将来,它可能会帮助其他人知道,当您尝试从多个位置加载同一程序集时,也会出现此异常

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

SafeDirectoryCatalog
有助于/方便地避免应用程序崩溃,但MEF仍然不会加载程序集