该项目是一个针对.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运行它可以正常工作。
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
找到任何内容。如何搜索引用它的内容?
答案 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)
我之前遇到过这种情况,尝试了很多东西为我解决了这个问题:
此外,如果这是在完整框架上运行的.net核心应用程序,我发现您必须在项目的根目录中包含global.json文件并将其指向您想要的SDK用于该项目:
{
"sdk": {
"version": "1.0.0-preview2-003121"
}
}
答案 4 :(得分:1)
在将应用程序从4.6.1迁移到4.7.2后,我们开始在生产服务器上收到此错误。
我们注意到那里没有安装.NET Framework 4.7.2。为了解决此问题,我们执行了以下步骤:
从以下位置安装了.NET Framework 4.7.2:
重新启动机器
借助.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)
可能有其中一个:
答案 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附带的版本)进行编译时,我遇到了这个问题。
我今天终于解决了;该解决方案需要完成以下两项操作:
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
更改为<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
。答案 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=\"Web\" /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 的最新版本,但仍然遇到相同的问题。
我解决了
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
<ItemGroup>
标签下添加一个新的 <Reference>
标签,如下所示<Reference Include="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
答案 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 运行时。
安装此项目后,我可以使用最新的 MSBuild 构建我的项目,并且没有错误!
答案 20 :(得分:-3)
此问题基于您安装的Visual Studio和Windows版本,您可以按照以下步骤操作:-
通过以下命令降级PCL
Install-Package Xamarin.Forms -Version 2.5.1.527436