Когда у меня есть ссылка на Microsoft.Web.Mvc.dll в моем проекте ASP.NET MVC 3.0, я получаю ошибку, когда я строю 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, Версия = 3.0.0.0, Культура = нейтральный, PublicKeyToken = null 'не имеет реализации. ":" Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory "} System.Exception {System.TypeLoadException}
+ [1] {"Метод 'GetControllerSessionBehavior' в типе" Microsoft.Web.Mvc.Resources.ResourceControllerFactory "из сборки" Microsoft.Web.Mvc, версия = 3.0.0.0, культура = нейтральная , PublicKeyToken = null 'не имеет реализации. ":" Microsoft.Web.Mvc.Resources.ResourceControllerFactory "} System.Exception {System.TypeLoadException}
Просто для проверки я удалил ссылку на Microsoft.Web.Mvc.dll (физически удалив ее из директории bin), а затем все просто отлично. Похоже, что 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
ОБНОВЛЕНИЕ:
Как отметил Дарин Димитров в своем ответе, мне нужно исключить 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; }
}
}