您必须添加对程序集'netstandard,Version = 2.0.0.0的引用

emz*_*ero 75 .net asp.net asp.net-mvc .net-framework-version

该项目是一个针对.NET Framework 4.6.1的ASP.NET MVC Web应用程序.

突然(某些NuGet包升级了)我在运行时遇到了以下错误:

CS0012:类型'System.Object'在未引用的程序集中定义.您必须添加对程序集'netstandard,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'的引用.

在我的主视图中Index.cshtml,在我使用的行中@Html.ActionLink

我的机器上安装了.NET Core SDK 2.0和.NET Framework 4.7.1,但我不想包含对它的引用.这只是一个.NET Framework Web应用程序,它托管在Windows IIS上,其中安装的框架是4.6.1,服务器中没有安装.NET Core.

那么为什么要求添加引用netstandard呢?如何在不引用netstandard但完整的Windows .NET Framework 4.6.1的情况下修复它?

我检查了以前的提交工作正常,我仍然收到此错误.所以它与升级的NuGet包无关.似乎是我本地开发机器上的东西.

如果将应用程序发布到目录并使用IIS运行它可以正常工作.

链接到.csproj要点

packages.json

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.5.0.2" targetFramework="net46" />
  <package id="BundleTransformer.Core" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Handlebars" version="1.9.73" targetFramework="net46" />
  <package id="BundleTransformer.Less" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Yui" version="1.9.52" targetFramework="net46" />
  <package id="Dapper" version="1.42" targetFramework="net46" />
  <package id="EcmaScript.Net" version="1.0.1.0" targetFramework="net46" />
  <package id="EntityFramework" version="6.0.0" targetFramework="net46" />
  <package id="Glimpse" version="1.8.6" targetFramework="net46" />
  <package id="Glimpse.AspNet" version="1.9.2" targetFramework="net46" />
  <package id="Glimpse.Mvc5" version="1.5.3" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.Core" version="1.2.4" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.V8" version="1.3.0" targetFramework="net46" />
  <package id="jQuery" version="2.1.3" targetFramework="net46" />
  <package id="jQuery.Validation" version="1.13.1" targetFramework="net46" />
  <package id="LowercaseDashedRoute" version="1.0.14" targetFramework="net46" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.SqlServer.Compact" version="4.0.8876.1" targetFramework="net46" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
  <package id="Moment.js" version="2.10.2" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="10.0.3" targetFramework="net46" />
  <package id="NWebsec" version="5.1.1" targetFramework="net46" />
  <package id="NWebsec.Core" version="2.1.0" targetFramework="net46" />
  <package id="NWebsec.Mvc" version="5.1.1" targetFramework="net46" />
  <package id="Owin" version="1.0" targetFramework="net46" />
  <package id="Respond" version="1.4.2" targetFramework="net46" />
  <package id="Sendgrid" version="6.3.0" targetFramework="net46" />
  <package id="SendGrid.SmtpApi" version="1.3.1" targetFramework="net46" />
  <package id="Serilog" version="2.6.0" targetFramework="net46" />
  <package id="Serilog.Enrichers.Environment" version="2.1.2" targetFramework="net46" />
  <package id="Serilog.Sinks.File" version="3.2.0" targetFramework="net46" />
  <package id="Serilog.Sinks.RollingFile" version="3.3.0" targetFramework="net46" />
  <package id="Serilog.Sinks.Sentry" version="2.1.4" targetFramework="net46" />
  <package id="SerilogWeb.Classic" version="2.1.17" targetFramework="net46" />
  <package id="SharpRaven" version="2.2.0" targetFramework="net46" />
  <package id="System.Data.SQLite" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Core" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.EF6" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Linq" version="1.0.108.0" targetFramework="net46" />
  <package id="Twitter.Bootstrap.Less" version="3.3.4" targetFramework="net46" />
  <package id="WebActivatorEx" version="2.0.6" targetFramework="net46" />
  <package id="WebGrease" version="1.6.0" targetFramework="net46" />
  <package id="YUICompressor.NET" version="2.7.0.0" targetFramework="net46" />
</packages>
Run Code Online (Sandbox Code Playgroud)

使用VS2017将应用程序发布到文件系统时,我在输出中收到以下警告:

下面装配有一个版本是高于目标,可能不会引起故障运行时正确加载.NET Framework的依赖关系:netstandard,版本= 2.0.0.0,文化=中性公钥= cc7b13ffcd2ddd51.依赖项是:System.Transactions,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089.您应该确保依赖程序集对于目标框架是正确的,或者确保要处理的目标框架是从属程序集的目标框架.

但我找不到任何东西System.Transactions.我如何搜索引用它的内容?

Qua*_*ngo 91

我认为解决方案可能是GitHub上的这个问题:

尝试在web.config中添加netstandard引用,如下所示:"

<system.web>
  <compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
  <httpRuntime targetFramework="4.7.1" />
Run Code Online (Sandbox Code Playgroud)

我意识到你正在使用4.6.1,但.NET 4.7.1的选择很重要,因为较旧的Framework版本与.NET Standard 2.0不完全兼容.

我从痛苦的经历中了解到这一点,当我介绍.NET标准库时,我遇到了很多关于NUGET包和引用破坏的问题.您需要考虑的另一个更改是升级到PackageReferences而不是package.config文件.

请参阅本指南,您可能还需要一个工具来帮助升级.它确实需要一个晚期的VS 15.7版本.

  • 这也解决了从 net48 ASP.NET 项目引用 netstandard2.0 库时的问题。 (3认同)
  • 我认为任何来到这里的人都应该看看 Newtonsoft.JSON 的作者编写的关于编写开源库的优秀指南:https://docs.microsoft.com/en-us/dotnet/standard/library-guidance/cross-平台目标 - 特别是“避免包含 netstandard1.x”目标,并使用 .NET 4.7.2 作为支持 .netstandard 2.0 的最低真实版本 (2认同)

Dam*_*yer 33

我不得不在这个线程上结合其他人的答案。

  1. 通过 NuGet 安装 NetStandard.Library
  2. 手动编辑 .csproj 文件并添加引用。 <Reference Include="netstandard" />
  3. 在 VS 解决方案资源管理器中展开项目--> 参考,右键单击“netstandard”并显示属性页面并将“Copy Local”设置为 true。

  • 设置“复制本地”对我来说是这样。 (7认同)

kam*_*ilk 21

手动编辑.csproj文件并添加下面的引用对我有用。

<Reference Include="netstandard" />
Run Code Online (Sandbox Code Playgroud)

谢谢Fahad Alshaya 在这里提出的建议。

  • 这对我不起作用,但在主 web.config 文件的 system.web/compilation/assemblies 部分下添加 `&lt;add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"/&gt;`做过。我不断地从一种解决方案切换到另一种解决方案,参考不起作用,但 web.config 设置起作用。我的目标是 .NET 4.7.2 和 MVC 5.2.7。这是一个令人讨厌的错误。 (13认同)
  • 这对我有用,我还必须通过 NuGet 安装 NetStandard.Library。 (3认同)
  • @UlyssesAlves 其他参考标签旁边的某个地方 (2认同)
  • @kamilk“在其他地方旁边”不是很准确。好吧,我查看了其他一些项目,但不幸的是这对我不起作用,我决定从另一个角度解决这个问题,这不涉及更改项目的 .net 版本。 (2认同)

小智 11

删除 Bin 和 Obj 文件夹对我有用。


Rag*_*hav 9

从 4.6.1 框架升级到 4.7.2 后,我们开始收到此错误:

“类型'System.Object' 是在未引用的程序集中定义的。您必须添加对程序集'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 的引用。” 最终的解决方案是添加上面提到的“netstandard”程序集参考:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
Run Code Online (Sandbox Code Playgroud)

  • 这有效。另一件有效的事情(没有此更改)是将 `&lt;Reference Include="netstandard" /&gt;` 添加到 csproj 文件,但是......只有当您还将 CopyLocal 设置为 true 时才有效。这些都没有任何意义。 (6认同)

小智 8

在此输入图像描述

在 netstandard.dll 属性中将 Copy Local 设置为 true。

打开解决方案资源管理器并右键单击 netstandard.dll。将复制本地设置为 True。


小智 6

我以前遇到过这个问题,并尝试了很多方法为我解决了这个问题:

  • 删除 bin 文件夹(如果存在)
  • 删除隐藏的 .vs 文件夹
  • 确保安装了 4.6.1 目标包
  • 最后的努力:添加对 System.Runtime 的引用(右键单击项目 -> 添加 -> 引用 -> 勾选 System.Runtime 旁边的框),尽管我想我一直认为上面的一个已经解决了它这样做。

此外,如果这是在完整框架上运行的 .net 核心应用程序,我发现您必须在项目的根目录中包含一个global.json文件,并将其指向要用于该项目的 SDK:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 尝试了所有,没有运气。这不是我所说的 .NET Core 项目。这是一个普通的 .NET Framework 4.6.1。 (2认同)

Geo*_*son 5

虽然这是一个旧线程,但我今天遇到了同样的问题,上周我更新了一些 NuGet 包,尽管 MVC 网站在我的开发计算机上运行正常,但当我发布到测试服务器时它失败了。

我读了很多帖子,但没有一个起作用。我最后将本地bin中的DLL与测试服务器中的DLL进行比较,发现netstandard.dll没有上传,一旦上传网站就可以正常工作,不知道为什么VS2017 web部署没有发布DLL。

只是需要注意一下,以防上述方法都不适合您。


小智 5

这是 netstandard.dll 存在的位置:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\Facades\netstandard.dll 通过此将引用添加到您的项目。

  • 惊人的!这为我指明了正确的方向:只有框架 4.7.2 完全支持`netstandard2.0`,没有任何问题:https://weblog.west-wind.com/posts/2019/Feb/19/Using-NET-Standard- with-Full-Framework-NET#net-standard-and-full-framework-net(我希望微软能够解释这一点) (3认同)