Справочные типы 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 и отображаемой странице!

enter image description here

Это работает на .NET Framework 4.7.1, и я ожидаю, что это будет работать на .NET Framework 4.7.2. также.

Примечание. В среде IDE по-прежнему будет красный волнистый круг с отсутствующим сообщением об ошибке типа Enum. Но так как это не влияет на функциональность (Intellisense работает и код запускается), я надеюсь, что сейчас это будет приемлемо.