您必须添加对assembly&net; netstandard,Version = 2.0.0.0的引用

时间:2018-04-19 16:01:58

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

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

突然(某些NuGet包升级了)我在运行时遇到了以下错误:

  

CS0012:类型' System.Object'在一个不是的程序集中定义   引用。您必须添加对assembly&net; 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运行它可以正常工作。

Link to .csproj gist

packages.json

<?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,版本= 2.0.0.0,   Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51。依赖关系   是:System.Transactions,版本= 4.0.0.0,文化=中立,   公钥= b77a5c561934e089。你应该确保   依赖程序集对于目标框架是正确的,或者确保它   您要解决的目标框架是从属框架   组装

但我无法在System.Transactions找到任何内容。如何搜索引用它的内容?

21 个答案:

答案 0 :(得分:49)

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

请参见this guide,您可能还需要tool to help the upgrade。不过确实需要较晚的VS 15.7版本。

答案 1 :(得分:4)

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

1 /通过NuGet安装NetStandard.Library。 2 /手动编辑.csproj文件并添加引用

Driver

3 /扩展项目-> VS解决方案资源管理器中的参考,右键单击“ netstandard”并显示属性页,​​并将“ Copy Local”设置为true。

答案 2 :(得分:3)

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

public static class IQueryableExtensions
{
    public static T TakeLast<T>(this IQueryable<T> input) where T : class, IIDentity
    {
        return input
            .OrderByDescending(x => x.Id)
            .FirstOrDefault();
    }
}

谢谢here提出建议的Fahad Alshaya。

答案 3 :(得分:1)

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

  • 删除bin文件夹(如果存在)
  • 删除隐藏的.vs文件夹
  • 确保已安装4.6.1定位包
  • Last Ditch Effort:添加对System.Runtime的引用(右键单击项目 - &gt; add - &gt; reference - &gt;勾选System.Runtime旁边的框),虽然我认为我总是想通了上面的一个解决了它,而不是这样做。

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

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

答案 4 :(得分:1)

在将应用程序从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确认.NET Framework版本 How do I find the .NET version?

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

只是需要注意的事情,以防上述任何方法都不对您有用。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

我遵循了here概述的说明。

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

答案 9 :(得分:0)

可能有其中一个:

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

答案 10 :(得分:0)

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

打开解决方案资源管理器,然后右键单击netstandard.dll。 将“本地复制”设置为true。

答案 11 :(得分:0)

我现在遇到同样的问题,请按照“现在设置”应用程序的要求进行操作

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

答案 12 :(得分:0)

当尝试向.NET4.6.1库中添加.NETStandard依赖项,并在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。

答案 13 :(得分:0)

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

将其添加到项目web.config时将无法使用,因为它可与MVC一起使用。

答案 14 :(得分:0)

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

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

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

输出类型

  • 控制台应用程序
  • 类库

答案 15 :(得分:0)

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>

答案 16 :(得分:0)

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

答案 17 :(得分:0)

就我而言,我已将 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 文件并在 <ItemGroup> 标签下添加一个新的 <Reference> 标签,如下所示
  • <Reference Include="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  1. 按照 VS 提示重新加载项目,然后重新构建,但我没有看到相同的问题。

答案 18 :(得分:0)

我在一个 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>

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

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

答案 19 :(得分:0)

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

我是通过安装 .Net SDK 项目发现的,当您选择该项目时,也会安装 .NET 5.0 运行时和 .NET 3.1 运行时。

enter image description here

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

答案 20 :(得分:-3)

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

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

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