【问题标题】: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)添加所有需要的引用背部。大多数时候,它都有效,但我不知道它之前为什么会失败。

标签: asp.net .net asp.net-mvc .net-framework-version


【解决方案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】:

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

  1. 通过 NuGet 安装 NetStandard.Library
  2. 手动编辑 .csproj 文件并添加引用。 &lt;Reference Include="netstandard" /&gt;
  3. 扩展项目-->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】:

        可能与以下之一有关:

        1. 安装更新的 SDK。
        2. 在 .csproj 中检查 Reference Include="netstandard"
        3. 在 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。为了解决这个问题,我们做了以下步骤:

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

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

          2. 重启机器

          3. 在以下人员的帮助下确认了 .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 添加到您的项目中。

              【讨论】:

              【解决方案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 附带的版本)对其进行编译时遇到了这个问题。

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

              1. 在 .csproj 文件中将 &lt;TargetFrameworkVersion&gt;v4.6.1&lt;/TargetFrameworkVersion&gt; 更改为 &lt;TargetFrameworkVersion&gt;v4.7.1&lt;/TargetFrameworkVersion&gt;
              2. 将您的单声道升级到较新的版本。我相信 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 的最新版本,但仍然遇到同样的问题。

                        我解决了

                        1. 仔细查看错误信息 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
                        2. 打开 .csproj 文件并在&lt;ItemGroup&gt; 标签下添加一个新的&lt;Reference&gt; 标签,如下所示
                        • &lt;Reference Include="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /&gt;
                        1. 按照 VS 提示重新加载项目并重新构建,我没有看到同样的问题。

                        【讨论】:

                          【解决方案21】:

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

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

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

                          【讨论】:

                            猜你喜欢
                            • 2019-10-16
                            • 2019-06-28
                            • 2022-09-29
                            • 2012-03-31
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多