Ссылка на нестандартные типы 2.0 в ASP.NET MVC 5 бритвенных представлений в .NET 4.7.1 - PullRequest
0 голосов
/ 04 мая 2018

.NET 4.7.1 должен был решить проблемы, с которыми мы столкнулись при обращении к библиотекам 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, содержащий всего пару типов, поэтому я мог бы попрактиковаться ссылаться на эти типы на страницах просмотра MVC 5. И, конечно же, это все еще не удается. Например, этот простой тип из нестандартного проекта:

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 Ответ

0 голосов
/ 05 мая 2018

Я посмотрел на решение (потрясающее объяснение @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 работает и код запускается), я надеюсь, что сейчас это будет приемлемо.

...