Справочные типы netstandard 2.0 в представлениях брандмауэра ASP.NET MVC 5 в.NET 4.7.1
.NET 4.7.1 должен был решить проблемы, с которыми мы столкнулись при обращении netstandard 2.0
библиотекам netstandard 2.0
из полной структуры. В некотором роде, несмотря на некоторые продолжающиеся и болезненные предупреждения о конфликтах DLL и связанные с этим проблемы, а также необходимость обновления вручную до PackageReferences (см. Это замечательное расширение). Тем не менее, можно заставить его работать, хотя см. Примечание 1 ниже, и, если я могу сказать: к сожалению, мягко говоря, не было никакой помощи VStudio или большого руководства по этому и смежным вопросам, до сих пор нужно найти такое помощь по тыловым каналам на github. Сама эта проблема в идеале была бы сообщена: ASP.NET MVC 5 пока не поддерживает стандарт netstandard в бритве... хотелось бы, чтобы они просто сообщили нам об этом, если это правда! Спасет бесконечные потраченные впустую часы! Но так ли это? Или есть исправление?
Вот тогда возникает проблема с проектами ASP.NET MVC 5 (даже с теми, которые нацелены на 4.7.1). Хотя простой код .cs работает, в том числе в контроллерах, это не относится к любому коду в представлениях бритвы (файлы .cshtml
). Любые типы, на которые ссылаются бритвенные представления, полученные из netstandard
библиотеки, полностью терпят неудачу.
Чтобы воспроизвести эту проблему и убедиться, что это был не только мой собственный код, я воспроизвел его , создав новый проект ASP.NET MVC 5 (на github) в новейшей версии VStudio 2017 (даже в версии Preview, 15.7.0). Preview 4.0), затем netstandard
новый netstandard
проект, содержащий всего несколько типов, так что я мог бы попрактиковаться ссылаться на эти типы на страницах просмотра MVC 5. И, конечно же, это все еще не удается. Например, этот простой тип из проекта netstandard:
public enum AnimalType { Cat, Dog, Zebra, Alligator }
Если вы сделаете это перечисление типом в вашей модели представления, переданной на страницу, если вы когда-либо будете ссылаться на это свойство на странице бритвы, вы получите ошибки времени компиляции, а также во время выполнения, говоря:
Тип Enum определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку 'netstandard, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51'. AspMvc5WebApp471
Как также подробно описано в этом репо, я даже пытался перекомпилировать свою собственную версию Microsoft.CodeDom.Providers.DotNetCompilerPlatform
чтобы ссылаться на нее в web.config
, но это не решило проблему.
Поэтому было бы приятно услышать от команды ASP.NET или кого-либо еще, кто знает, как решить эту проблему, что может повлечь за собой это исправление. Или, если ASP.NET MVC 5 просто еще не работает с netstandard
, было бы неплохо узнать, является ли это сообщением, и если поддержка netstandard
может появиться в ASP.NET MVC 5 в ближайшем будущем, или если это на дорожной карте где-нибудь? И, возможно, что именно вызывает эту неудачу? Конечно, было бы радостно услышать, есть ли исправление, которое можно применить прямо сейчас, но в любом случае, мы должны знать, иначе netstandard
в основном бесполезен для тех из нас, кто не может просто сбросить ASP.NET MVC 5 в день (сколько бы мы ни хотели, в реальном мире...) Очень ценится.
(Примечание 1: Net Framework 4.7.1 с нетерпением ожидалась мной и многими другими, когда было сказано, что в течение некоторого времени она решит многие болевые точки, но, к сожалению, она представила свой собственный набор бесконечных dll-ад-подобных проблем, или посмотрите здесь, или здесь, или здесь. См., например, обсуждения на System.Net.Http
(и перенаправления привязки не просто удаляют все предупреждения о конфликтах, они часто вызывают свои собственные, очень болезненные вещи). Теперь некоторые имеют я надеялся, что 4.7.2 решит все эти проблемы, хотя он не решил эти проблемы ASP.NET MVC 5 для меня)
Ответы
Ответ 1
Я посмотрел на решение (потрясающее объяснение @Nicholas Petersen !!) и увидел, что во время компиляции Razor вам не хватает ссылки на netstandard.dll (именно в этом и заключается ошибка).
Я добавил его в список сборок, используемых во время компиляции следующим образом:
<add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
Раздел у меня теперь выглядит так:
<system.web>
<compilation>
<assemblies>
<add assembly="System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
</assemblies>
</compilation>
</system.web>
С этим изменением я смог заставить IDE показывать мне Intellisense для модели в файле cshtml и отображаемой странице!
Это работает на .NET Framework 4.7.1, и я ожидаю, что это будет работать на .NET Framework 4.7.2. также.
Примечание. В среде IDE по-прежнему будет красный волнистый круг с отсутствующим сообщением об ошибке типа Enum. Но так как это не влияет на функциональность (Intellisense работает и код запускается), я надеюсь, что сейчас это будет приемлемо.