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

该项目是一个针对.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运行它可以正常工作 .

Link to .csproj gist

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>

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

以下程序集依赖于高于目标的.NET Framework版本,并且可能在运行时导致失败时无法正确加载:netstandard,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51 . 依赖项是:System.Transactions,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089 . 您应该确保依赖程序集对于目标框架是正确的,或者确保要处理的目标框架是从属程序集的目标框架 .

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

回答(4)

3 years ago

我认为解决方案可能是this issue on GitHub

尝试在web.config中添加netstandard引用,如下所示:“<system.web>
<compilation debug =“true”targetFramework =“4.7.1”>
<组件>
<add assembly =“netstandard,Version = 2.0.0.0,Culture = neutral,
公钥= cc7b13ffcd2ddd51" />
</组件>
</汇编>

<httpRuntime targetFramework =“4.7.1”/>

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

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

请参阅this guide,您可能还需要tool to help the upgrade . 它确实需要一个晚期VS 15.7版本 .

3 years ago

可能有其中一个todo:

  • 安装较新的SDK .

  • 在.csproj中检查参考包含= "netstandard"

  • 检查Views \ Web.config和Web.config中编译标记中的程序集版本 .

3 years ago

我之前遇到过这种情况,尝试了很多东西已经为我修好了:

  • 删除bin文件夹(如果存在)

  • 删除隐藏的.vs文件夹

  • 确保已安装4.6.1定位包

  • Last Ditch Effort:添加对System.Runtime的引用(右键单击项目 - > add - > reference - >勾选System.Runtime旁边的框),虽然我想我总是想通了上面的一个已经解决了它而不是这样做 .

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

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}

3 years ago

此问题基于您安装的Visual Studio和Windows版本,您可以按照以下步骤操作: -

  • 转到命令窗口

  • 通过以下命令降级您的PCL

Install-Package Xamarin.Forms -Version 2.5.1.527436
  • 重建您的项目 .

  • 现在您将能够看到所需的输出