【问题标题】:Reference netstandard 2.0 types in ASP.NET MVC 5 razor views in .NET 4.7.1在 .NET 4.7.1 中的 ASP.NET MVC 5 剃刀视图中引用 netstandard 2.0 类型
【发布时间】:2018-05-04 01:32:21
【问题描述】:

.NET 4.7.1 应该解决我们在从完整框架中引用 netstandard 2.0 库时遇到的问题。尽管有一些持续和痛苦的 dll 冲突警告和相关问题,并且需要手动更新到 PackageReferences (see this wondeful extension),但它确实做到了。尽管如此,人们可以让它工作,虽然见下面的注释 1,如果我可以说:不幸的是,至少可以说在这个和相关问题上没有 VStudio 帮助或太多指导,直到现在人们必须找到这样帮助在 github 上的后台频道。理想情况下,这个问题本身会得到消息:ASP.NET MVC 5 尚不支持剃须刀中的 netstandard ......希望他们只会向我们发送消息,如果是真的!将节省无尽浪费的时间!但真的是这样吗?或者有什么解决办法?

这就是 ASP.NET MVC 5 项目的问题(即使是那些针对 4.7.1 的项目)。尽管普通的 .cs 代码可以工作,包括在控制器中,但对于 razor 视图(.cshtml 文件)中的任何代码,这不是正确的。来自netstandard 库的剃刀视图中引用的任何类型都完全失败。

为了重现这个问题并确保它不仅仅是我自己的代码,我在最新版本的 VStudio 2017(甚至是预览版,15.7.0 Preview 4.0)中重现了这个by making a bran new ASP.NET MVC 5 project (on github),然后制作了一个新的@ 987654333@ 项目中只有几个类型,所以我可以练习在 MVC 5 视图页面中引用这些类型。果然,它仍然失败。例如,来自 netstandard 项目的这个简单类型:

public enum AnimalType { Cat, Dog, Zebra, Alligator }

如果您在传递给页面的视图模型中将该枚举作为类型,如果您曾经在剃刀页面中引用该属性,您将收到编译时错误,并且在运行时也会出现:

“枚举”类型是在未引用的程序集中定义的。您必须添加对程序集“netstandard,Version=2.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”的引用。 AspMvc5WebApp471

正如那个 repo 中所详述的那样,我什至尝试重新编译我自己的 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 版本以在 web.config 中引用它,但这并没有解决问题。

因此,很高兴听到 ASP.NET 团队或其他任何可能知道如何解决此问题的人的意见,以及该修复可能需要什么。或者,如果 ASP.NET MVC 5 还不能与 netstandard 一起使用,那么很高兴知道这是否是消息,如果在不久的将来 ASP.NET MVC 5 可能会支持 netstandard,或者如果它在某个地方的路线图上?也许究竟是什么导致了这次失败?当然,最高兴听到是否有可以立即应用的修复程序,但无论哪种方式,我们都需要知道,否则netstandard 对于我们这些不能只转储 ASP.NET 的人来说基本上没用一天完成 MVC 5 (在现实世界中,我们想尽可能多地......)非常感谢。

(注1:Net Framework 4.7.1被我和很多人热切期盼,曾经有段时间说能解决很多痛点,可惜引入了自己的一套endless dll hell like problems ,或参见hereor hereor here。例如,参见System.Net.Http 上的讨论(绑定重定向不只是删除所有冲突警告,它们通常会带来自己的、非常痛苦的东西)。现在有些人一直希望 4.7.2 能够解决所有这些问题,尽管它并没有为我解决这些 ASP.NET MVC 5 问题)

【问题讨论】:

  • 你试过直接引用netstandard.dll吗?
  • @AlexGhiondea 正如我在底部引用的第三篇文章(第二篇 'here')中所引用的那样,正如您所看到的 here,他们曾经有一个 NETStandard.Library.NETFramework nuget 包基本上就是您所要求的(netstandard dll),但这已被“弃用。要在 VS2017 15.3 中使用 .NET Framework 中的 .NET Standard 库,您只需要安装 .NET Core 2.0 SDK。”
  • 但也许还有需要参考的地方。但是,为什么其他一切仍然有效(除剃刀之外的所有其他代码)?因此,连同上述观点,我坚信这不仅仅是缺少包裹或其他东西。如果有的话,也许它的 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 需要更新,虽然我真的不知道,并且希望有来自 ASP.NET 团队的人或有知识的人在这里加入
  • 顺便说一句,我还尝试将NETStandard.Library从nuget安装到ASP.NET MVC项目中,它实际上安装了两个东西:NETStandard.Library.2.0.2Microsoft.NETCore.Platforms.1.1.0它没有工作或做任何事情不同的。它并没有(有点令人惊讶)引发额外的错误,但尽管如此,它没有任何帮助。我还了解到在这个位置有一个netstandard.dllC:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\NETStandard.Library\2.0.1\build\netstandard2.0\ref\netstandard.dll。引用也没有做任何事情。
  • 是的!正如我在主帖中所说,它在这里:github.com/copernicus365/AspMvc5NetstandardCompatibility 感谢您对这个问题感兴趣!

标签: asp.net-mvc razor .net-standard


【解决方案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 向我显示 cshtml 文件中模型的 Intellisense 和呈现的页面!

这是在 .NET Framework 4.7.1 上运行的,我希望它可以在 .NET Framework 4.7.2 上运行。也是。

注意:IDE 中仍会出现红色波浪线,其中包含有关 Enum 类型缺失的错误消息。但由于这不会影响功能(Intellisense 工作并且代码运行),我希望现在可以接受。

【讨论】:

  • 您,先生,非常感谢您,无以言表。我刚刚测试了更新,它可以工作!我不知道您到底是如何找到这个晦涩的修复程序的,但它似乎在我的本地测试中有效。此外,我不知道有什么区别,但它似乎并没有向我展示 cshtml 页面(在 IDE 中)中的红色波浪形错误。下周我将发布更新到你的修复,也许我们可以看到我所做的任何更改(与我们正在进行的对话相关)是否也修复了 IDE 错误,与你所看到的相比。
  • 此外,虽然这还为时过早,但您的修复也可能修复一些一般的 NET 4.7.1 ASP MVC 问题,即当有人认为他们没有引用 netstandard 库(但可以确定吗?!所有的 nugets 之一可能是 netstandard)。所以问题是,在这个极其令人沮丧的失败之后,在我们的大企业解决方案中,我将所有本地库从 netstandard 退回到完整的 Net 4.7.1 库。但即便如此,我仍然遇到同样的问题。但是您的解决方案也解决了这个问题,很难相信我的眼睛。我希望我看到的不是幻影!
  • 为了让每个人都清楚,您之前在主要的web.config 中看到的是:&lt;compilation debug="true" targetFramework="4.7.1"/&gt;。将其更改为如图所示,但请确保保留 `debug="true"` 属性,也许还有 targetFramework="4.7.1" 属性,尽管没有该属性一切都很好。但是 VS 在缺少 debug="true"` 属性时给出了调试时间对话警告。所以使用答案中给出的 XML 段,但第一行带有额外的 debug 属性:&lt;compilation debug="true"&gt;
  • 我花了几天时间试图找到解决这个问题的方法。这就是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多