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


124

该项目是针对.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 gist

packages.config

<?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,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089。您应该确保从属程序集对于目标框架是正确的,或者确保要处理的目标框架是从属程序集的目标框架。

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


1
您正在使用哪些NuGet软件包?您确定没有引用ASP.NET Core吗?
里卡多·佩雷斯

@RicardoPeres VS2017不允许您添加一个针对与项目不同的框架。我已经卸载并重新安装了所有软件包,但错误是相同的。我不明白为什么会这样,甚至在运行时也是如此……
emzero

2
System.Data.SQLite.Core软件包基于.NET Core(或.NET Standard,我没有去寻找源代码或文档)。查看项目文件末尾的错误消息。
McGuireV18年

您为什么说基于upn .NET Core?我正在查看packages\System.Data.SQLite.Core.1.0.108.0\lib目录,它包含.NET Framework每个版本的文件夹,包括4.6(我正在使用的文件夹)。我认为这不是问题所在。
emzero

2
当我遇到无法解决的问题时,我要做的是1)仔细记下项目的引用是什么(或将.csproj保存在某个地方),2)删除packages.config文件,删除所有外部引用(或者,您可以编写一个新项目仅使用原始静态文件,.cs等从头开始),3)将VS Nuget配置为使用“程序包引用”而不是“ legacy包”。配置模式docs.microsoft.com/en-us/nuget/reference/…和4)重新添加所有需要的参考。在大多数情况下,它都能正常工作,我不知道为什么它以前失败了。
西蒙·穆里尔

Answers:


181

我认为解决方案可能是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 Standard库时,我遇到了很多有关NUGET包和引用中断的问题。您需要考虑的另一个更改是升级到PackageReferences而不是package.config文件。

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


2
我认为到达这里的任何人也应该阅读由Newtonsoft.JSON的作者撰写的有关编写开源库的出色指导:docs.microsoft.com/en-us/dotnet/standard/library-guidance / ...-特别是“避免包括netstandard1.x“目标,并使用.NET 4.7.2作为支持.netstandard 2.0的最低实际版本-Quango 18'1
11/1

升级到v4.7.2(非核心应用程序)并得到如下所示的异常时正是需要的:“类型'DateTime'是在未引用的程序集中定义的。您必须添加对程序集'netstandard,版本的引用= 2.0.0.0,文化=中性,PublicKeyToken = cc7b13ffcd2ddd51'。–
Ted

这是否还必须添加到csproj文件的引用中,还是仅在web.config中需要?
petrosmm '18

1
好答案。谢谢。我正在升级旧的实用程序包,并在其位置上安装了新的Standard 2.0。特别是此Web应用程序存在问题,因为<add assembly="netstandard缺少该应用程序,并且httpRuntime也不是4.7.1-这就是答案!谢谢 !!
Piotr Kula

在我们的案例中,4.7.2 ASP.Net项目使用了几个标准2.0程序集,但是我们将System.Text.Json.Serialization命名空间中的一些JsonConverter添加到了一个标准2.0项目中,这导致了此错误。此解决方案解决了我们的问题。
ShaneH

35

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

<Reference Include="netstandard" />

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


这应该放在项目文件中的什么位置?里面还有其他“标签”?
Ulysses Alves

1
@UlyssesAlves在其他参考标签旁边的某个地方
kamilk

@kamilk“某处紧挨其他”不是很准确。好吧,我看了其他一些项目,但是不幸的是,这对我不起作用,我决定从另一个角度来解决这个问题,而这并不涉及更改项目的.net版本。
尤利西斯·阿尔维斯

1
这对我有用,我还必须通过NuGet安装NetStandard.Library。
David Acero

“让你得到”的小事...很好的答案。
Benj Sanders

15

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

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

3
设置“本地复制”对我来说有用。
FrenkyB

1
该解决方案可以完美地工作,而且项目不依赖于在调试模式下进行编译。
DarkHawk

6

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

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

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

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

2
尝试了所有,没有运气。正如我所说的,这不是.NET Core项目。这是一个正常的.NET Framework 4.6.1。
emzero

关闭VS,删除bin,删除.vs-我很高兴。
里德·希尔斯


5

从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>

1
这可行。另一有效的方法(不进行此更改)是将<Reference Include="netstandard" />ss 添加到csproj文件中,但是...仅当您还将CopyLocal设置为true时,该方法才有效。这些都没有任何意义。
Triynko

1

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

我读了很多帖子,但是都没用。我最终将本地bin中的DLL与测试服务器中的DLL进行了比较,发现netstandard.dll没有上载,一旦上载的网站正常运行,就不确定为什么VS2017 Web部署未发布DLL。

万一上述内容对您没有帮助,请注意。


1

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

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

尝试删除<RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion><NetStandardImplicitPackageVersion>节中的.csproj的。


1

在将应用程序从4.6.1迁移到4.7.2后,我们开始在生产服务器上收到此错误。

我们注意到那里没有安装.NET Framework 4.7.2。为了解决此问题,我们执行了以下步骤:

  1. 从以下位置安装了.NET Framework 4.7.2:

    https://support.microsoft.com/zh-cn/help/4054530/microsoft-net-framework-4-7-2-offline-installer-for-windows

  2. 重新启动机器

  3. 如何找到.NET版本的帮助下确认了.NET Framework 版本。

在计算机上安装了.Net Framework 4.7.2版本的情况下再次运行该应用程序解决了该问题。


1

我面临着同样的问题,我现在要按照“立即安装”进行操作

1-

<compilation debug="true" targetFramework="4.7.1">
      <assemblies>
        <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
      PublicKeyToken=cc7b13ffcd2ddd51"/>
      </assemblies>
    </compilation>

2-添加参考

 **C:\Program Files (x86)\Microsoft Visual
Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\ADL
 Tools\2.4.0000.0\ASALocalRun\netstandard.dll**

3

Copy Above Path Dll to Application Bin Folder on web server


这在哪里记录?任何人都将如何猜想将此行放入web.config文件?顺便说一句,同样有效的方法是在csproj中添加一行引用“ netstandard”的行,并将CopyLocal设置为true。即便如此,在任何地方的“引用”对话框中甚至都没有将其列为可能的引用,因此,获取它的唯一方法是手动添加它。疯了吧。我的目标是.NET 4.7.2,它应该与.NET标准完全兼容,但是我必须执行这些晦涩的步骤才能使其工作。
Triynko

0

可能与以下其中一项有关:

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

好的,希望我们快到了。“我添加了对NETStandard.Library的引用,而不是NETStandard.Library.NETFramework”,请检查此信息:github.com/dotnet/standard/issues/391
ivw

通常,System.Transactions不是您的引用的一部分,请尝试通过以下方式将其添加到您的引用中:如果您使用的是Web应用程序,则右键单击您的引用,如果您使用的是网站,则单击Project。在.NET参考中找到System.Transactions。您应该在引用中找到System.Transactions。
ivw


0

尝试将.NETStandard依赖项添加到.NET4.6.1库并在Linux中使用Mono 4.6.2(Ubuntu 16.04附带的版本)进行编译时,我遇到了此问题。

我今天终于解决了;该解决方案需要同时执行以下两项操作:

  1. 在.csproj文件中更改<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion><TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
  2. 将您的单声道升级到新版本。我相信5.x应该可以运行,但是可以肯定的是,您可以只安装Ubuntu 20.04(在撰写本文时仅在预览中),其中包括Mono 6.8.0.105。

0

您可以在项目中添加到web.config中。

当您将其添加到项目web.config中时,它将不起作用,因为它可与MVC一起使用。


0

以我为例,我发现有问题的nuget是版本4.5.1中的System.Memory。当更新到版本4.5.3时,它可以工作!!


0

那些没有web.config文件的人。Web应用程序以外的输出类型。使用以下给出的代码更新项目文件(.csproj)。

这可能是由于以不正确的方式添加/删除.netframework引起的,或者它可能是意外中断的方式。

  <ItemGroup>
    <Reference Include="netstandard" />
  </ItemGroup>

输出类型

  • 控制台应用
  • 类库

-5

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

  1. 转到命令窗口
  2. 通过以下命令降级PCL

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. 重建您的项目。
  4. 现在您将能够看到所需的输出
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.