Подтвердить что ты не робот

Получить Visual Studio, чтобы выделить синтаксис Razor с пользовательским хостом factoryType

Здесь сценарий, я расширил MvcWebRazorHostFactory, поэтому я могу сделать немного дополнительной магии просмотра во время сборки. Точная магия не имеет значения.

Регистрация в моем ~\Views\Web.config выглядит так:

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" />

Там, к соответствующей сборке в проекте, копия сборки в папке \lib, и я подтвердил, что она скопирована в \bin, как ожидалось. Кроме того, реальная магия представления происходит при построении представлений, поэтому сам ASP.NET на самом деле находит все.

Что не работает в Visual Studio (2012) Razor Подсветка синтаксиса.

enter image description here

Выше представлен снимок того, как сбой подсветки синтаксиса. Как правило, ничего не в пространстве имен, непосредственно @using 'd не может быть найдено (и, таким образом, получает красную красноватую подчеркивание), а директива @model не работает. Это указывает на некоторые проблемы с получением автоматически включаемых пространств имен в Web.config.

Подсказка для ошибки на @model: "Имя" модель "не существует в текущем контексте".

Сквозь пробную версию и ошибку я сузил основную причину в разделе выше host config, хотя у нас есть некоторые другие настройки вокруг Razor (пользовательский pageBaseType), это одна строка, которая разбивает все.

Вещи, которые я пробовал до сих пор:

  • Сильное именование сборки
  • Установка сборки в GAC

При сильном имени my ~\Views\Web.config выглядит так:

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b61d663b67b05bd2" />

Я проверил версию, культуру и PublicKeyToken против GAC, используя "gacutil -l".

Я полагаю, что другой возможной точкой отказа является сам GAC, так как в моей коробке имеется тонна версий .NET. Как сборка, так и веб-сайт построены с помощью .NET 4.5 (оба ссылаются на MVC 4, Razor 2 и т.д.). Путь к gacutil, который я использовал во время отладки, Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\gacutil.exe.

Иногда во время моего winninging к первопричине я получаю сообщение об ошибке "Эффект StackExchange.MyNamespace.MyFactory не найден" в первой строке представления. Подчеркивание будет в цвете "Другая ошибка" (фиолетовый в темной теме VS2012). Я не мог достоверно воспроизвести это, поэтому я не могу получить скриншот.


Итак, мой вопрос: кто-нибудь знает, как заставить Visual Studio (2012 снова) правильно обрабатывать Razor Views с помощью настраиваемого хоста factory?

Мое последнее лучшее предположение об исправлении делает некоторые действительно взломанные замены Web.config, поэтому у меня есть одна конфигурация при редактировании, а другая - при отладке. На самом деле не поклонник этой идеи.

Кажется, что это должно сработать, и что Visual Studio просто беспокоит поиск чего-то, что ему нужно. Я просто не знаю, что это такое.


Обновление после нескольких экспериментов.

У меня есть больше разработчиков, чтобы воспроизвести, что это <host pageFactoryType="...">, в том числе в приложении vanilla MVC4 (приведенные выше примеры, несколько явно, из решения StackOverflow, которое могло иметь некоторый треск).

Мы нашли работу, хотя, чтобы купить лицензию ReSharper. Не большая (или дешевая) работа вокруг, но работа вокруг все равно.

С установленным ReSharper все работает с одним оговором. Если у вас есть пользовательская регистрация <pages pageBaseType="...">, тип должен быть в одном проекте или вы не получите intellisense для ссылки @this.Model (хотя работает директива @model).


Дополнительные обновления.

Похоже, что no-op HostFactory (тот, который расширяет MvcRazorHostFactory, но не отменяет каких-либо методов или содержит какой-либо другой код) отлично работает , если, вы его сильно назовите и установите в GAC. Я считаю, что использовал неправильный GAC при тестировании ранее, но (с некоторым внешним подталкиванием) смог заставить его работать, используя явно x64 gacutil.

Теперь проблема заключается в выяснении того, что не так с моим конкретным хостом factory; более подробные сведения поступают по мере их обнаружения.

4b9b3361

Ответ 1

После некоторого обсуждения с Microsoft мы обнаружили основную причину этой проблемы.

Как обычно, это был мой код.

Корневая ошибка была ссылкой MVC3 в пользовательском параметре factoryType, несмотря на то, что проект (и все вокруг него) MVC4.

Чтобы суммировать все, чтобы Visual Studio IntelliSense работала в .cshtml файлах с пользовательским <host factoryType>:

  • Вы должны прочно назвать свою сборку
  • Вы должны установить сборку в GAC
    • Мы по-прежнему отлаживаем и развертываем локальную копию, но VS будет выглядеть в GAC
  • У вас должны быть все правильные ссылки *

Имейте в виду, что вам необходимо перезапустить Visual Studio после установки в GAC, просто перезагружая решение, как правило, недостаточно. Мы также обнаружили, что некоторые (но не все) установки ReSharper нуждаются в очистке кэш-памяти, чтобы с безопасностью очистить кеш.

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

enter image description here

Кроме того, Visual Studio предоставит вам ряд сообщений об ошибках (фиолетовое подчеркивание "Другая ошибка", которое я не смог достоверно воспроизвести ранее), если ваш пользовательский factory выдает любые исключения; за исключением, возможно, в нем конструктора (который казался немного непоследовательным).

В тех случаях, когда вы не получаете помощи, это тот случай, в котором мы находились, где сам тип имеет серьезные проблемы. Было просто совпадением, что все работало во время выполнения (интерфейсы, с которыми мы играли, не менялись между MVC3 и MVC4, а остальное - слабым наименованием).

* Если вы похожи на нас и у вас установлена ​​бета-версия MVC с 1 по 4, будьте в курсе PEBKAC на этом этапе.