框架程序集“System.Runtime,Version=4.0.10.0”在当前目标框架中无法解析的依赖项。

8
TFS 2013 - 构建:ASP.Net 4.5.1网站,出现以下错误:
warning MSB3268: The primary reference "C:\Builds\2\MyProj\Web1_Main\bin\MyProj1.dll"
 could not be resolved because it has an indirect dependency on the framework assembly 
"System.Runtime, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which
 could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.5.1". To resolve this problem, either remove the reference 
"C:\Builds\2\MyProj\Web1_Main\bin\MyProj1.dll" or retarget your application to a framework 
version which contains "System.Runtime, Version=4.0.10.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a".

所有项目和网站最初都使用Unity 1.0.0.0,现在已经升级到4.5.2。以上的错误中,MyProj1是参考Unity的,我也将它升级到了3.5.1。
请阅读此链接:https://unity.codeplex.com/workitem/12756,工作服务器已经添加了更新后的4.5.2版本。
因此,我降级到了4.5.1,但仍然出现错误。
问题的解决方案如下:
  • 在Visual Studio 2013中本地构建解决方案没有问题。

  • 单独的类库项目通过TFS构建没有问题,但当将MyProj作为网站的引用时,则会失败。

有什么想法吗?
在升级过程中,是否需要进行Web.config更改,除了TargetFramework设置之外?

我认为是这样的。你看过 <assemblyBinding> <dependentAssembly> 了吗? - Spock
@Spock,没有。你有什么建议吗?由于错误提示显示Unity 3.5需要Runtime 4.0.10.0,但我的网站是针对4.5.2版本的。在这种情况下,设置会是什么样子呢? - gbs
3个回答

4
由于我的项目依赖于其他项目,我不得不将Unity升级到3.5版本,然后这个错误又出现了。这一次,我终于把它解决了。这篇文章对我很有帮助:http://devsilos.blogspot.com/2014/10/msb3268-while-targeting-aspnet-web-site.html
解决方法是从以下路径中复制构建时报错的所有文件: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5.2\Facades
到 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5.2
以下是上述链接中的解释,以防它在未来因任何原因而失效:
深入检查发现以下有趣的事实:aspnet_compiler由于某种原因不考虑位于4.5程序集(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\Facades)下的.dll文件。它只查找C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5下的文件。结果,整个过程失败了,因为System.Threading.Tasks和System.Runtime .dll文件都位于Facades目录下,而不是v4.5目录下。
现在的解决方案如下: 1. 简单地将缺失的.dll文件从Facade目录复制到v4.5目录中。 2. 在.sln文件中将TargetFrameworkMoniker设置为4.5.1。确切的语法如下:TargetFrameworkMoniker=".NETFramework,Version%3Dv4.5.1"。
在这种情况下,aspnet_compiler无法识别所需框架的确切版本,并尽可能使用GAC。如果在构建机器上安装了4.5的最高版本,我相信它应该可以工作。

这太不可思议了。我在这个MSBuild问题上花费了无数的时间。我分析了依赖关系,甚至使用了ILSpy来分析它们的依赖关系。我搜索了网络并尝试了一些解决方案 - 但都没有成功。仍然出现错误,指出某些内容“无法解析,因为它对框架程序集System.Runtime[...]具有间接依赖性,而该程序集在当前目标框架.NETFramework,Version=v4.8中无法解析”...然后我找到了你的解决方案。“荒谬!”我想,但是由于没有更好的想法,我尝试了一下……结果居然奏效了。真是难以置信。 - pKami

2
实际上,对不起,我不认为 "assemblyBinding" 会有帮助。 这似乎是一个已知的错误。它还没有被解决。使用 Unity 3.5,您可以针对 .NET 4.5.1,但不能针对 4.5.2。 因此,一种选择是重新定向到 .NET 4.5.1,看看问题是否消失,如果可以的话。
另外,您也可以尝试 .NET Framework 4.5.2 Developer Pack。但有些人提到它没有起作用。

是的,那就是我在问题中提到的错误,我已经尝试过新的开发人员包,但它并没有起作用。而且我已经放弃了并转向实际上4.5版本。 - gbs
安装 .Net Framework 4.5.2 开发人员包对我来说起作用了。 - deadlydog

0

我们最近遇到了一个类似的问题,一个网站升级到了.NET 4.5,最初按照gbs's answer中的解决方案进行了操作。

在我们的情况下,我们有几个警告遵循这个模式:

<project name>.metaproj: 警告 MSB3268:主引用“<project reference>.dll”无法解析,因为它间接依赖于框架程序集“System.Runtime,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”,在当前目标框架中无法解析。".NETFramework,Version=v4.5"。要解决此问题,请删除引用“<project reference>.dll”或将应用程序重新定位到包含“System.Runtime,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的框架版本中。

我们随后发现,如果您创建一个针对4.5.x的新网站(文件>新建>网站...),并选择ASP.NET空网站模板,则包Microsoft.Net.Compilers将被包含在内。将此包添加到我们的网站中解决了问题,而无需触及参考程序集。
在最初的两个解决方案中,复制文件导致构建成功,但存在维护问题,而更改TargetFrameworkMoniker(从4.5.1更改为4.5.3)会产生不同的构建错误,并且是一种脆弱的解决方案。

我没有尝试显式地使用第二个选项。 是的,维护将是一个问题,如果设置了新的构建服务器,我们也需要修复它。 我会尝试您的修复程序。 我两天前找到了解决方案,但愿您能在我之前找到,可以节省我几个小时:) - gbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接