我正在准备一个全新的ASP.NET MVC 5.1解决方案。我正在添加一堆NuGet包,并与Zurb Foundation等进行设置。
作为其中的一部分,我添加了对内部NuGet包的引用,这是一个可移植类库,我认为这会导致构建服务器出现问题。
TeamCity失败了构建:
“System.Object”类型在未引用的程序集中定义。您必须添加对程序集'System.Runtime,Version = 4.0.0.0的引用
我最初在编译Razor网页时添加了相同或类似错误的修复,修复了在web.config
中
<compilation ... >
<assemblies>
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</assemblies>
</compilation>
但问题尚未解决。
要实现此修复,请首先展开现有的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>
在对代码库进行微小更新后尝试运行ASP .NET MVC项目时,我也遇到了这个问题,即使它编译时没有错误:
编译器错误消息:CS0012:类型“System.Object”在未引用的程序集中定义。您必须添加对程序集'System.Runtime,Version = 4.0.0.0,Culture = neutral,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):error CS0012:类型'System.Object'在程序集中定义没有引用。您必须添加对程序集'System.Runtime,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'的引用。
c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ meseems.webapp \ 68e2ea0f \ 8c5ee951 \ assembly \ dl3 \ 52ad4dac \ 84698469_3bb3d401 \ System.Collections.Immutable.DLL :(符号相关的位置)到以前的错误)
显然,添加到我们项目中的新软件包引用了旧版本的.NET Framework,导致“多个程序集中的定义”问题(CS1685),这导致了运行时剃刀视图编译器错误。
我删除了不兼容的软件包(System.Collections.Immutable.dll),问题就停止了。但是,如果在项目中无法删除包,则需要尝试Baahubali's answer。
我在一个带有Web API项目和几个库项目的解决方案中遇到了这个问题。其中一个库项目是在构建时borking,错误表示Unity属性不是“有效”属性,然后一个错误说我需要引用System.Runtime。
经过多次搜索,重新安装4.5.2开发包,没有任何工作,我想也许这只是一个版本不匹配。所以我查看了每个项目的属性,其中一个基础库的目标是4.5,而其他每个库的目标是4.5.2。我将那个更改为目标4.5.2并且错误消失了。
我将System.Runtime.dll添加到bin项目,它工作:)
我将文件“C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5.1 \ Facades \ system.runtime.dll”复制到生产服务器的bin文件夹,这样就解决了问题。
通过Nuget Package Manager删除引用并重新添加它解决了我的问题。
添加对此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
@ PeterMajeed在接受的答案中的评论帮助我解决了相关问题。我没有使用可移植的库,但在新的Windows Server 2012安装上遇到了相同的构建错误,我正在运行TeamCity。
安装Microsoft .NET Framework 4.5.1 Developer Pack解决了这个问题(在单独安装MS Build Tools之后)。
唯一对我有用的方法。将程序集添加到web.config
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</assemblies>
</compilation>
我在VS 2015(虽然不是MVC)的某些解决方案中遇到了这个问题,甚至在一个工作站上的相同解决方案中也没有在另一个工作站上。将.NET版本更改为4.6并引用PCL后,出现错误。
解决方案很简单:关闭解决方案并删除与解决方案相同的文件夹中隐藏的.vs文件夹。
按照其他答案中的建议添加缺少的引用也可以解决问题,但即使再次删除引用后错误仍然会解决。
至于TeamCity,我不能说因为我的配置从来没有问题。但请确保您将工作目录重置为调试工作的一部分。
安装.NET Runtime以及您要定位的.NET版本的目标包。
开发人员包只是捆绑在一起的这两件事,但截至今天似乎没有4.6版本,所以你必须分别安装这两个项目。
下载可以在这里找到:http://blogs.msdn.com/b/dotnet/p/dotnet_sdks.aspx#
这是一个老问题,但我今天面对它,以便在我们的持续集成服务器上修复构建管道。添加
<Reference Include="System.Runtime" />
我的.csproj
文件解决了我的问题。
一点上下文:感兴趣的项目是一个完整的.Net框架4.6.1项目,在开发机器上没有构建问题。问题仅出现在构建服务器上,我们无法控制,可能是由于不同的SDK版本或类似的东西。
添加建议的<Reference
解决了构建错误,代价是Visual Studio中缺少引用警告(引用树中添加的条目上的黄色三角形)。
我希望这可以帮助类似场景中的人...
在我们的Tfs 2013构建服务器上,我在测试项目中遇到了同样的错误。主网站项目在.Net 4.5.1上运行。
我安装了一个系统运行时的nuGet包,并添加了来自packages \ System.Runtime.4.3.0 \ ref \ net462 \ System.Runtime.dll的引用
这解决了我。
我需要下载并安装Windows 8.0(而不是8.1)SDK,以使错误在我的TeamCity服务器上消失。
https://developer.microsoft.com/en-us/windows/downloads/windows-8-sdk