ASP.NET MVC 3.0 + совместимость с Microsoft.Web.Mvc 3.0 + MEF - PullRequest
2 голосов
/ 13 февраля 2011

Когда у меня есть ссылка на 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; }
    }
}

Ответы [ 2 ]

4 голосов
/ 13 февраля 2011
Дроссели

MEF, потому что он сканирует все сборки в папке bin, которые содержат интерфейсы и классы, и класс MvcDynamicSessionControllerFactory, который реализует IControllerFactory, оказывается запечатанным. Поэтому единственное решение, которое я вижу здесь, - исключить сборку Microsoft.Web.Mvc из этого процесса scan . Я не знаком с MEF, но в StructureMap, где есть та же проблема, вы можете исключить типы.

0 голосов
/ 12 декабря 2012

В будущем это может помочь другим узнать, что вы также можете получить это исключение при попытке загрузить одну и ту же сборку из нескольких мест.

В моей ситуации я изменил место сброса сборки сборки плагина, над которой работал, без очистки от предыдущего местоположения.В результате приложение загружало одну и ту же сборку из обоих мест и сгладило это исключение.Очистка сброса сборки позволила решить проблему.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100; 100 '.

...