ChatGPT解决这个技术问题 Extra ChatGPT

您必须添加对程序集 '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 应用程序,它托管在已安装框架为 4.6.1 的 Windows IIS 上,服务器中没有安装 NET Core。

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

我已经检查了以前的提交,它运行良好,但我仍然收到此错误。所以它与正在升级的 NuGet 包无关。似乎是我本地开发机器上的东西。

如果将应用程序发布到目录并使用 IIS 运行它,它就可以工作。

Link to .csproj gist

包.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、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089。您应该确保依赖程序集对于目标框架是正确的,或者确保您正在处理的目标框架是依赖程序集的框架。

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

您正在使用哪些 NuGet 包?你确定你没有引用 ASP.NET Core 吗?
@RicardoPeres VS2017 不允许您添加针对与项目所针对的框架不同的框架的包。我已经卸载并重新安装了所有软件包,但错误是一样的。我不明白它为什么会发生,甚至为什么在运行时......
System.Data.SQLite.Core 包基于 .NET Core(或 .NET Standard,我没有去寻找源代码或文档)。查看项目文件末尾的错误消息。
为什么说是基于upn .NET Core?我正在查看 packages\System.Data.SQLite.Core.1.0.108.0\lib 目录,它包含每个 .NET Framework 版本的文件夹,包括我正在使用的 4.6。我不认为这是这里的问题。
当我遇到这样无法解决的问题时,我要做的是 1)仔细注意项目的引用是什么(或将 .csproj 保存在某处),2)删除 packages.config 文件,删除所有外部引用(或者你可以编写一个新项目仅使用原始静态文件、.cs 等从头开始),3)将 VS Nuget 配置为使用包引用而不是旧版 packages.config 模式 docs.microsoft.com/en-us/nuget/reference/… 和 4)添加所有需要的引用。大多数时候,它有效,我不知道为什么它之前失败了。

W
Wai Ha Lee

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

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

我知道您使用的是 4.6.1,但 .NET 4.7.1 的选择很重要,因为较旧的 Framework 版本与 .NET Standard 2.0 不完全兼容。

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

请参阅 this guide,您可能还需要 tool to help the upgrade。不过,它确实需要一个后期的 VS 15.7 版本。


我认为任何到达这里的人也应该看看 Newtonsoft.JSON 的作者编写的关于编写开源库的优秀指南:docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - 特别是“避免包含 netstandard1.x”目标,并使用 .NET 4.7.2 作为支持 .netstandard 2.0 的最低真实版本
升级到 v4.7.2(非核心应用程序)时所需要的正是如下所示的异常:“类型 'DateTime' 是在未引用的程序集中定义的。您必须添加对程序集的引用'netstandard, Version =2.0.0.0,文化=中性,PublicKeyToken=cc7b13ffcd2ddd51'。
这是否也必须添加到 csproj 文件中的引用中,还是仅在 web.config 中需要?
很好的答案。谢谢。我正在升级一个旧的实用程序包,并在它的位置打了一个新的标准 2.0。这个网络应用程序特别有问题,因为缺少 <add assembly="netstandard 并且 httpRuntime 不是 4.7.1 - 这就是答案!谢谢 !!
在我们的案例中,4.7.2 ASP.Net 项目使用了几个标准的 2.0 程序集,但是我们将 System.Text.Json.Serialization 命名空间中的一些 JsonConverter 添加到了标准 2.0 项目之一,这导致了这个错误。这个解决方案解决了我们的问题。
V
VoronoiPotato

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

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

感谢 Fahad Alshaya 的建议here


这应该放在项目文件中的什么位置?在哪个其他“标签”内?
@UlyssesAlves 在其他参考标签旁边的某个地方
@kamilk“在其他地方旁边的某个地方”不是很准确。好吧,我查看了其他一些项目,但不幸的是这对我不起作用,我决定从另一个角度解决这个问题,这不涉及更改项目的 .net 版本。
这个对我有用,我还必须通过 NuGet 安装 NetStandard.Library。
这对我不起作用,但在主 web.config 文件的 system.web/compilation/assemblies 部分下添加 <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"/> 可以。我一直在从一种解决方案到另一种解决方案来回切换,参考不起作用,但 web.config 设置起作用了。我的目标是 .NET 4.7.2 和 MVC 5.2.7。这是一个讨厌的错误。
A
Armand

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

通过 NuGet 安装 NetStandard.Library 手动编辑 .csproj 文件并添加引用。 扩展项目--> VS 解决方案资源管理器中的引用,右键单击“netstandard”并显示属性页并将“复制本地”设置为 true。


设置“复制本地”为我做到了。
该解决方案完美运行,而且该项目不依赖于在调试模式下编译。
对我来说也是如此:通过 PackageReference 引用 NetStandard 2.0 库的 .NET Framework 4.8 应用程序(最新的 Visual Studio 2019 16.7.7)。
设置“复制本地”为我做到了。
这也适用于从 4.6.1 降级到 4.5。
V
Vijay Verma

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


R
Raghav

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

这行得通。另一件有效的事情(没有此更改)是将 <Reference Include="netstandard" /> 添加到 csproj 文件中,但是...仅当您还将 CopyLocal 设置为 true 时才有效。这些都没有任何意义。
WebConfig 条目对我没有帮助,它甚至发出警告说程序集是 system.web 下的非法子项。在 .csproj 文件中安装 netstandard nuget 和条目对我的 4.7.2 项目有帮助。请记住将 netstandard 引用设置为从属性复制本地。
K
Kyle Dodge

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

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

删除隐藏的 .vs 文件夹

确保已安装 4.6.1 定位包

最后的努力:添加对 System.Runtime 的引用(右键单击项目 -> 添加 -> 引用 -> 勾选 System.Runtime 旁边的框),虽然我想我一直想通上面的一个已经解决了它这样做。

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

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

都试过了,没有运气。正如我所说,这不是一个 .NET Core 项目。这是一个普通的 .NET Framework 4.6.1。
关闭 VS,删除 bin,删除 .vs - 我很高兴。
M
Machavity

https://i.stack.imgur.com/Ibsi6.png

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

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


G
George Phillipson

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

我阅读了许多帖子,但没有一个有效。最后我把本地bin中的DLL和测试服务器中的DLL进行了比较,发现netstandard.dll没有上传,一旦上传网站就可以了,不知道为什么VS2017 web deploy没有发布DLL。

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


T
Thiya

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

这可能是由于以不正确的方式添加/删除 .netframework 或它可能会以意想不到的方式破坏。

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

输出类型

控制台应用程序

类库


P
Patrick from NDepend team

这是 netstandard.dll 存在的地方: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\Facades\netstandard.dll 通过这个将 ref 添加到您的项目中。


请查看 formatting help page 以改进您的格式。
惊人的!这为我指明了正确的方向:只有框架 4.7.2 完全支持 netstandard2.0 而没有任何问题:weblog.west-wind.com/posts/2019/Feb/19/…(我希望微软已经解释了这一点)
I
Igor

可能与其中之一有关:

安装更新的 SDK。在 .csproj 中检查 Reference Include="netstandard" 检查 Views\Web.config 和 Web.config 中编译标记中的程序集版本。


好的,希望我们快到了。“我添加了对 NETStandard.Library 而不是 NETStandard.Library.NETFramework 的引用”检查这篇文章:github.com/dotnet/standard/issues/391
通常 System.Transactions 不是您的参考资料的一部分,请尝试通过以下方式将其添加到您的参考资料中:如果您使用的是 Web 应用程序,请右键单击您的参考资料;如果您使用的是网站,请右键单击您的项目。在 .NET 引用中找到 System.Transactions。您应该在参考资料中找到 System.Transactions。
i
istrupin

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

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

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


R
Raghav

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

我们注意到那里没有安装 .NET framework 4.7.2。为了解决这个问题,我们做了以下步骤:

从以下位置安装 .NET Framework 4.7.2:https://support.microsoft.com/en-us/help/4054530/microsoft-net-framework-4-7-2-offline-installer-for-windows 重新启动机器在如何找到 .NET 版本?

使用安装在机器上的 .Net Framework 4.7.2 版本再次运行应用程序解决了该问题。


M
Mansoor

我面临着同样的问题,我按照现在设置应用程序工作正常

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 文件中吗?顺便说一句,同样有效的方法是在引用“netstandard”的 csproj 中添加一行,并将 CopyLocal 设置为 true。即便如此,它甚至没有在任何地方的引用对话框中列为可能的引用,因此获得它的唯一方法是手动添加它。疯了吧。我的目标是 .NET 4.7.2,它应该与 .NET 标准完全兼容,但我必须执行这些晦涩的步骤才能使其正常工作。
k
knocte

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

我今天终于解决了;解决方案需要做这两件事:

将 .csproj 文件中的 v4.6.1 更改为 v4.7.1。将您的单声道升级到较新的版本。我相信 5.x 应该可以工作,但可以肯定的是,您可以只安装 Ubuntu 20.04(在撰写本文时还只是预览版),其中包括 Mono 6.8.0.105。


M
MEO

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

当您将它添加到项目 web.config 时它不起作用,因为它适用于 MVC。


k
k4st0r42

Quango 的解决方案正在运行,但我更喜欢通过在我的 Web.config 中添加此代码来解决它,例如新项目:

<system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

k
kolis

我在 net5.0 项目中遇到了同样的问题,其中包括使用 netstandard2.0 编写的构建任务

<Project>

  <Target Name="RestoreBuildTasks">
    <MSBuild Projects="../../../BuildTasks/BuildTasks.csproj" Targets="Restore" Properties="Configuration=Release"/>
  </Target>

  <Target Name="BuildBuildTasks">
    <MSBuild Projects="../../../BuildTasks/BuildTasks.csproj" Targets="Build" Properties="Configuration=Release"/>
  </Target>

  <UsingTask
      TaskName="Brick.Build.NugetTask"
      AssemblyFile="AGXBrick/BuildTasks/bin/$(Platform)/Release/netstandard2.0/BuildTasks.dll"/>

  <Target Name="CheckNuGetSources" BeforeTargets="Restore" DependsOnTargets="RestoreBuildTasks;BuildBuildTasks">
      <NuGetTask />
  </Target>

</Project>

BuildTasks.csproj 如下所示

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>

我能够通过在 MSBuild 任务中明确设置 TargetFramework=netstandard2.0 来解决此问题:

    <MSBuild Projects="../../../BuildTasks/BuildTasks.csproj" Targets="Restore" Properties="Configuration=Release;TargetFramework=netstandard2.0"/>


d
dawncold

我遇到了同样的问题,我的项目使用 .net framework 4.6.1,当我使用最新的 MSBuild(16.10.2) 构建解决方案时,我收到一条错误消息,例如 ValueType ...您必须参考 netstandard 2.0 .... .

我通过安装 .Net SDK 项目解决了这个问题,当您选择此项目时,也会安装 .NET 5.0 运行时和 .NET 3.1 运行时。

https://i.stack.imgur.com/HGbDc.png

安装此项目后,我可以使用最新的 MSBuild 构建我的项目并且没有错误!


u
user1314413

我有同样的问题,每隔一段时间就会出现一次,可能是由于切换分支。

使用 4.6.1。 Visual Studio 2019,更清晰...

我的解决方案是手动添加一个新引用,浏览到 netstandard.dll,添加它,构建(错误很多),删除引用,再次构建(没有错误)。


N
Neil McQuillan

对我来说,这就像在 web.config 文件中设置错误的框架一样简单。

解决方案是 4.8,但 web.config 是 4.5.1

<httpRuntime requestValidationMode="2.0" maxRequestLength="8192" executionTimeout="110" targetFramework="4.5.1" />

<httpRuntime requestValidationMode="2.0" maxRequestLength="8192" executionTimeout="110" targetFramework="4.8" />

K
Kiran Modini

就我而言,我已将 VS 2019 更新到 05/21 的最新版本,但仍然遇到同样的问题。

我解决了

仔细查看错误消息“对象”类型是在未引用的程序集中定义的。您必须添加对程序集的引用 'system.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 打开 .csproj 文件并在 标签下添加一个新的 标签,如下所示

按照 VS 提示重新加载项目,然后重新构建,我没有看到同样的问题。


S
Suraj Rao

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

转到命令行窗口,通过以下命令 Install-Package Xamarin.Forms -Version 2.5.1.527436 Rebuild Your Project 将您的 PCL 降级。现在您将能够看到所需的输出