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

问题描述 投票:33回答:7

该项目是一个针对.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上找不到任何东西。我如何搜索引用它的内容?

asp.net .net asp.net-mvc .net-framework-version
7个回答
58
投票

我认为解决方案可能是this issue on 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" />

我意识到你正在使用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版本。


10
投票

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

<Reference Include="netstandard" />

感谢Fahad Alshaya,他建议here


1
投票

我之前遇到过这种情况,尝试了很多东西为我解决了这个问题:

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

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

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

1
投票

虽然这是一个老线程,但今天我遇到了同样的问题,上周我更新了一些NuGet软件包,虽然我发布到测试服务器时MVC网站在我的开发机器上工作正常但它失败了。

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

如果上述任何一项都不适合您,请注意一些事项。


0
投票

可能有其中一个todo:

  1. 安装较新的SDK。
  2. 在.csproj中检查Reference Include =“netstandard”
  3. 检查Views \ Web.config和Web.config中编译标记中的程序集版本。

0
投票

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


0
投票

我在将.NET Core 1.1升级到2.1时遇到过这种情况。

我按照here概述的说明进行操作。

尝试删除csproj中的<RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion><NetStandardImplicitPackageVersion>部分。


-3
投票

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

  1. 转到命令窗口
  2. 通过以下命令降级您的PCL Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. 重建您的项目。
  4. 现在您将能够看到所需的输出
© www.soinside.com 2019 - 2024. All rights reserved.