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

Posted

技术标签:

【中文标题】您必须添加对程序集 \'netstandard, Version=2.0.0.0 的引用【英文标题】:You must add a reference to assembly 'netstandard, Version=2.0.0.0您必须添加对程序集 'netstandard, Version=2.0.0.0 的引用 【发布时间】:2018-09-30 05:12:56 【问题描述】:

该项目是一个面向 .NET Framework 4.6.1 的 ASP.NET MVC Web 应用程序。

突然间(升级了一些 NuGet 包)我开始在运行时收到以下错误:

CS0012:“System.Object”类型是在未定义的程序集中定义的 参考。您必须添加对程序集“netstandard”的引用, 版本=2.0.0.0,文化=中性,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

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 版本 高于目标且可能无法正确加载的框架 在运行时导致失败:netstandard,Version=2.0.0.0, 文化=中性,PublicKeyToken=cc7b13ffcd2ddd51。依赖项 是:System.Transactions,版本=4.0.0.0,文化=中性, 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)添加所有需要的引用背部。大多数时候,它都有效,但我不知道它之前为什么会失败。 【参考方案1】:

我认为解决方案可能是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 版本。

【讨论】:

我认为任何来到这里的人也应该看看 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, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 的引用。 这是否也必须添加到 csproj 文件中的引用中,还是只需要在 web.config 中? 很好的答案。谢谢。我正在升级一个旧的实用程序包,并在它的位置打了一个新的标准 2.0。这个网络应用程序特别有问题,因为缺少 &lt;add assembly="netstandard 并且 httpRuntime 不是 4.7.1 - 这就是答案!谢谢!! 在我们的例子中,我们有几个标准 2.0 程序集被 4.7.2 ASP.Net 项目使用,但我们将一些 JsonConverter 从 System.Text.Json.Serialization 命名空间添加到标准 2.0 之一项目并导致此错误。此解决方案解决了我们的问题。【参考方案2】:

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

<Reference Include="netstandard" />

感谢 Fahad Alshaya 的建议 here。

【讨论】:

这应该放在项目文件的什么地方?在哪个其他“标签”内? @UlyssesAlves 在其他参考标签旁边的某个地方 @kamilk “在其他地方旁边的某个地方”不是很准确。好吧,我查看了其他一些项目,但不幸的是,这对我不起作用,我决定从另一个角度解决这个问题,这不涉及更改项目的 .net 版本。 这个对我有用,我还必须通过 NuGet 安装 NetStandard.Library。 那些能“抓住你”的小事......很好的答案。【参考方案3】:

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

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

【讨论】:

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

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

【讨论】:

【参考方案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>

【讨论】:

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

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

删除 bin 文件夹(如果存在) 删除隐藏的 .vs 文件夹 确保已安装 4.6.1 定位包 Last Ditch Effort:添加对 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 - 我很高兴。【参考方案7】:

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

我阅读了很多帖子,但没有一个有用。最后对比了本地bin中的DLL和测试服务器中的DLL,发现netstandard.dll没有上传,上传后网站正常,不知道为什么VS2017 web deploy没有发布DLL。

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

【讨论】:

【参考方案8】:

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

打开解决方案资源管理器并右键单击 netstandard.dll。 将 Copy Local 设置为 true。

【讨论】:

【参考方案9】:

可能与以下之一有关:

    安装更新的 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。【参考方案10】:

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

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

尝试删除 .csproj 中的 &lt;RuntimeFrameworkVersion&gt;1.1.1&lt;/RuntimeFrameworkVersion&gt;&lt;NetStandardImplicitPackageVersion&gt; 部分。

【讨论】:

【参考方案11】:

在部署从 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 Framework 版本 How do I find the .NET version?

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

【讨论】:

【参考方案12】:

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

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

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

输出类型

控制台应用程序 类库

【讨论】:

【参考方案13】:

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

【讨论】:

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

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

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 标准完全兼容,但我必须执行这些晦涩的步骤才能使其正常工作。【参考方案15】:

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

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

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

【讨论】:

【参考方案16】:

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

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

【讨论】:

【参考方案17】:

Quango in 的解决方案正在运行,但我更喜欢通过在我的 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>

【讨论】:

【参考方案18】:

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"/>

【讨论】:

【参考方案19】:

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

我是通过安装.Net SDK项发现的,当您选择此项时,.NET 5.0 runtime和.NET 3.1 Runtime也会被安装。

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

【讨论】:

【参考方案20】:

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

我解决了

    仔细查看错误信息 The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'system.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 打开 .csproj 文件并在&lt;ItemGroup&gt; 标签下添加一个新的&lt;Reference&gt; 标签,如下所示
&lt;Reference Include="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /&gt;
    按照 VS 提示重新加载项目并重新构建,我没有看到同样的问题。

【讨论】:

【参考方案21】:

这个问题是基于你安装的visual studio和windows的版本,你可以按照以下步骤进行:-

    转到命令窗口

    通过以下命令降级您的 PCL

    Install-Package Xamarin.Forms -Version 2.5.1.527436
    
    重建您的项目。 现在您将能够看到所需的输出

【讨论】:

以上是关于您必须添加对程序集 'netstandard, Version=2.0.0.0 的引用的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集'netstandard,版本 = 2.0.0.0

部署到 Azure 网站时,您必须向 System.Runtime... 添加引用

.NET Standard依赖问题,吐血推荐未能加载文件或程序集“netstandard, Version=2.0.0.0, Culture=neutral

.NET Standard:程序集的清单定义与程序集引用不匹配

Asp.Net Core 中无法使用 ConfigurationManager.AppSettings

如何避免 Visual Studio 在目标框架名称目录中输出程序集?