您必须添加对程序集 '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。这个网络应用程序特别有问题,因为缺少<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 文件并添加引用。
<Reference Include="netstandard" />
扩展项目-->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>
【讨论】:
这行得通。另一件有效的事情(没有此更改)是将<Reference Include="netstandard" />
添加到 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 中的 <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>
或 <NetStandardImplicitPackageVersion>
部分。
【讨论】:
【参考方案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 文件中将
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
更改为 <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
。
将您的单声道升级到较新的版本。我相信 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=\"Web\" /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 文件并在<ItemGroup>
标签下添加一个新的<Reference>
标签,如下所示
<Reference Include="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-
按照 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:程序集的清单定义与程序集引用不匹配