当我在ASP.NET MVC 3.0项目中引用Microsoft.Web.Mvc.dll时,我在DirecotryCatalog
中构建CustomDependencyResolver
时出现错误。
string path = HostingEnvironment.MapPath("~/bin");
var container = new DirectoryCatalog(path);
然后我看了container.Parts.Results View.LoadedExeptions
并且说:
+ [0] {“方法'GetControllerSessionBehavior'类型'Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory'来自程序集'Microsoft.Web.Mvc,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = null'没有实现。“:”Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory“} System.Exception {System.TypeLoadException}
来自程序集'Microsoft.Web.Mvc,Version = 3.0.0.0,Culture = neutral'的类型'Microsoft.Web.Mvc.Resources.ResourceControllerFactory'中的+ [1] {“方法'GetControllerSessionBehavior' ,PublicKeyToken = null'没有实现。“:”Microsoft.Web.Mvc.Resources.ResourceControllerFactory“} System.Exception {System.TypeLoadException}
只是为了测试我删除了对Microsoft.Web.Mvc.dll的引用(从bin direcotry中物理删除它)然后一切都很好。看起来无法加载Microsoft.Web.Mvc.dll。
有什么工作吗?
我在这里找到了类似的问题http://forums.asp.net/t/1622399.aspx?MVC+3+RC.+Where+is+the+Futures+Assembly%3F答案说MVC 3 Beta Futures + 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
更新:
正如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; }
}
}
答案 0 :(得分:4)
MEF扼流圈,因为它正在扫描包含接口和类的bin
文件夹中的所有程序集,并且实现MvcDynamicSessionControllerFactory
的{{1}}类恰好被密封。因此,我在此处看到的唯一解决方案是从此扫描进程中排除IControllerFactory
程序集。我不熟悉MEF,但在StructureMap中有同样的问题,你可以排除类型。
答案 1 :(得分:0)
将来,当您尝试从多个位置加载相同的程序集时,可能会帮助其他人知道您也可以获得此异常。
在我的情况下,我更改了我正在处理的插件程序集的构建放置位置,而不是从以前的位置清除它。结果,应用程序从两个位置加载相同的程序集并清除此异常。清理构建下降解决了这个问题。
SafeDirectoryCatalog
对于不会导致应用程序崩溃很有帮助/便利,但MEF仍然无法加载程序集。