生成错误:您必须添加对System.Runtime的引用


209

我正在准备一个全新的ASP.NET MVC 5.1解决方案。我要添加一堆NuGet软件包,并使用Zurb Foundation等对其进行设置。

作为其中的一部分,我添加了对内部NuGet包的引用,该包是可移植类库,我认为这会在构建服务器上引起问题。

TeamCity通过以下操作使构建失败:

类型'System.Object'是在未引用的程序集中定义的。您必须添加对程序集'System.Runtime,版本= 4.0.0.0的引用

我最初是在编译Razor网页时添加了针对相同或相似错误的修复程序,该修复程序位于 web.config

<compilation ... >
  <assemblies>
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </assemblies>
</compilation>

但是,此问题尚未解决。

Answers:


216

要实施此修复程序,首先扩展现有的web.config编译部分,默认情况下如下所示:

<compilation debug="true" targetFramework="4.5"/>

扩展后,然后按照指示添加以下新配置XML:

  <assemblies>     
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />   
  </assemblies>

最终的web.config标记应如下所示:

<compilation debug="true" targetFramework="4.5">
  <assemblies>     
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />   
  </assemblies>
</compilation>

2
此问题蔓延到针对4.52的MVC项目,该项目不是已知的PCL,而是许多nuGet软件包。我相信卸载VS2013会触发此问题,但我不知道这是事实。仅在引用X-PagedList的视图中出现错误。添加对项目web.config的引用(而不是视图web.config)修复了该问题。
格雷格·特雷尔

1
@GregTerrell从旧版本的X.PagedList升级后,我遇到了这个确切的问题。真令人沮丧 添加引用有效,然后.vs在关闭项目后删除文件夹(重命名),重新打开文件夹,删除web.config条目,然后构建并运行正常。
Mardoxx

@Mardoxx我一直遇到同样的问题。VS或X.PagedList是否有问题?如果是VS错误,我可以修补web.config,但是如果问题出在X.PagedList上,则我不想更改.config文件。
Jecoms '16


3
将MoreLINQ安装到我的.Net 4.5.1项目中后,出现此错误。这个答案解决了。
克里斯·莫斯基尼

125

添加对此System.Runtime.dll程序集的引用可解决此问题:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\System.Runtime.dll

尽管该显式路径中的该文件在构建服务器上不存在。

找到有关PCL和这些Facades的文档后,我将回发更多信息。

更新资料

是的,整个互联网上的外墙组件几乎没有。

谷歌:

(Facades OR Facade) Portable Library site:microsoft.com

2
如果在指定的文件夹中找不到dll文件,则可以按照说明安装Windows SDK:stackoverflow.com/a/14517992/3918598
2014年

谢谢。安装4.5.1 SDK后,以上链接有效。
马特·贝克曼

40
现在,Microsoft支持上有一篇知识库文章可以解决此问题。
Peter Majeed 2015年

1
@PeterMajeed您真的应该在此处发布该评论作为答案。非常感谢您的小费!
julealgon

3
为了使其正常运行,我必须将“复制本地”设置为true
Phate01 '18

28

对我有用的唯一方法。将程序集添加到web.config

<compilation debug="true" targetFramework="4.5">
  <assemblies>     
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />   
  </assemblies>
</compilation>

1
谢谢萝琳娜!为我工作
Annia Martinez

单线工作,不依赖于库的路径,不需要安装任何东西,应该接受!)
Ivan Zverev

此答案与@Baahubali的最高投票答案相同
Jesper Mygind

27

@PeterMajeed在接受的答案中的评论帮助我解决了相关问题。我没有使用可移植库,但是在运行TeamCity的全新Windows Server 2012安装中出现了相同的生成错误。

安装Microsoft .NET Framework 4.5.1开发人员包可解决此问题(单独安装MS Build Tools后)。


5
有什么想法要用4.6吗?我没有看到开发者包。
georgiosd 2015年

4
我同时拥有4.5.1和4.5.2开发包,但仍然收到此错误。有想法吗?我不想在我所有的25个项目中都引用它。由于某些原因,其他25个不需要它。
abatishchev 2015年

好的问题-至少从构建自动化的角度来看,我还没有处理过4.5.2或4.6。
sfuqua

我想,如果您确实遇到问题,可以随时打开免费的Visual Studio Community Service Edition并保持其最新状态。
路加·普普利特

我不明白为什么必须安装这些开发人员包。我安装了VS2013 Pro。这还不够吗?但这解决了这里的问题。谢谢。
Mike de Klerk

10

我在VS 2015上的某些解决方案(虽然不是MVC)中,甚至在一个工作站上却在另一个工作站上都​​没有相同的解决方案中遇到了这个问题。将.NET版本更改为4.6并引用PCL后,开始出现错误。

解决方案很简单:关闭解决方案,并在与解决方案相同的文件删除隐藏的.vs文件夹。

按照其他答案中的建议添加丢失的引用也可以解决该问题,但是即使再次删除引用,该错误仍然可以解决。

至于TeamCity,我不能说,因为我的配置从来没有问题。但是请确保在调试工作中重置工作目录。


6

这是一个老问题,但是我今天要面对它,以便在我们的持续集成服务器上修复构建管道。新增中

<Reference Include="System.Runtime" />

我的.csproj档案为我解决了问题。

有一点上下文:感兴趣的项目是一个完整的.Net Framework 4.6.1项目,在开发计算机上没有构建问题。该问题仅出现在我们无法控制的构建服务器上,可能是由于不同的SDK版本或类似原因所致。

添加拟议的<Reference解决了构建错误,但代价是Visual Studio中缺少参考警告(参考树中添加的条目上的黄色三角形)。

我希望这可以帮助处于类似情况的人们...


在类似的情况下也为我解决了问题
Nicola Celiento


3

我对代码库进行了次要更新后,尝试运行ASP .NET MVC项目时也遇到了这个问题,即使它编译时没有错误:

编译器错误消息: CS0012:类型'System.Object'是在未引用的程序集中定义的。您必须添加对程序集“ System.Runtime,版本= 4.0.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a”的引用。

我们的项目从未遇到过此问题,因此我对更改配置文件表示怀疑,然后才找出根本原因。从错误日志中,我能够找到详细的编译器输出,指出了实际发生的情况:

警告CS1685:在全局别名中的多个程序集中定义了预定义类型'System.Runtime.CompilerServices.ExtensionAttribute';使用'c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ mscorlib.dll中的定义

c:\ Users \ Admin \ Software Development \ source-control \ Binaries \ Publish \ WebApp \ Views \ Account \ Index.cshtml(35,20):错误CS0012:类型'System.Object'在程序集中定义未引用。您必须添加对程序集“ System.Runtime,版本= 4.0.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a”的引用。

c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \临时ASP.NET文件\ meseems.webapp \ 68e2ea0f \ 8c5ee951 \ assembly \ dl3 \ 52ad4dac \ 84698469_3bb3d401 \ System.Collections.Immutable.DLL:(与符号相关的位置到先前的错误)

显然,添加到我们项目中的新程序包引用了旧版本的.NET Framework,从而导致“多个程序集中的定义”问题(CS1685),从而导致运行时剃刀视图编译器错误。

我删除了不兼容的程序包(System.Collections.Immutable.dll),并停止发生此问题。但是,如果无法在您的项目中删除该软件包,则需要尝试Baahubali的答案


2

在我们的Tfs 2013构建服务器上,在一个测试项目中,我遇到了相同的错误。主Web项目在.Net 4.5.1上运行

我安装了系统运行时的nuGet软件包,并从packages \ System.Runtime.4.3.0 \ ref \ net462 \ System.Runtime.dll添加了引用

那为我解决了。


这可能不起作用,因为您告诉它在.NET 4.5.1项目中使用.NET 4.6.2 DLL
Chris Marisic

1
..但它确实起作用了,对我来说也是如此。... \ 45 \ ...文件夹中只有一个存根文件,称为 _._
nathanchere别无选择



1

我在一个带有Web API项目和几个库项目的解决方案中遇到了这个问题。其中一个库项目在构建时令人厌烦,出现错误,指出Unity属性不是“有效”属性,然后出现一个错误,表明我需要引用System.Runtime。

经过大量搜索,重新安装了4.5.2 Developer Pack,但没有任何效果,我发现这可能只是版本不匹配。因此,我查看了每个项目的属性,其中一个最基本的库的目标是4.5,而其他每个库的目标是4.5.2。我将其更改为也针对4.5.2,错误消失了。


1

我将文件“ C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.1 \ Facades \ system.runtime.dll”复制到生产服务器的bin文件夹中,这解决了问题。


另一种方法是在项目中添加对此程序集的引用,并设置Copy Local = True。
John Mc


0

对我来说,仅帮助了以下代码行:

Assembly.Load("System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");


-1

通过Nuget软件包管理器删除引用并重新添加它可以为我解决问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.