.NET 4.0构建服务器参考程序集警告MSB3644

34

我的构建服务器出现了一堆错误:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(847,9): 警告 MSB3644: 找不到框架“ .NETFramework,版本=v4.0”的参考程序集。请安装该框架版本的 SDK 或 Targeting Pack,或将您的应用程序重新定位到您已安装有 SDK 或 Targeting Pack 的框架版本。请注意,程序集将从全局程序集缓存 (GAC) 中解析,并将用于代替参考程序集。因此,您的程序集可能无法正确定位到您打算使用的框架。 [D:\adis\mercury\AdisFeeds\cache\Adis.Feeds.Cache.ConsoleManager\Adis.Feeds.Cache.ConsoleManager.csproj]

问题在于我已经安装了Windows SDK 7.1中的.NET部分... 我特别小心地勾选了旁边的.NET 4.0参考程序集。

有人有任何关于出错原因的建议吗?

记录一下,我正在使用Nant运行构建脚本(版本为0.86),以及用于msbuild nant任务的nant.contrib(0.85)。

更新 我刚刚在追查这个方向。我在我的开发机上使用msbuild进行编译,同时开启了诊断日志,然后在构建服务器上再次进行了编译。然后我比较了这些日志。

看起来重要的差异在于缺少\Program Files\References Assemblies路径的任何引用。具体来说,在FrameworkPathOverride中就是如此。

因此,我尝试将FrameworkPathOverride作为命令行参数添加到msbuild中。不幸的是,这只让我发现参考程序集目录似乎只有xml文件。也就是说,只有mscorlib.xml,没有mscorlib.dll

到底是怎么回事?!?


1
它们在吗?C:\Program Files\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0。要注意64位操作系统的麻烦,它们也有c:\program files (x86)。 - Hans Passant
我只是在追踪那个角度。我在我的开发机上使用带有诊断日志记录的msbuild编译了解决方案,然后又在构建服务器上进行了编译。然后我比较了这些日志。 - Jero
8个回答

33

好的,我找到了一个可行的解决方案。您需要执行两个步骤:

  1. 首先,将FrameworkPathOverride添加为命令行参数,并将其指向参考程序集目录。

类似于:

  msbuild -p:FrameworkPathOverride="C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  1. 第二件事情是找到完整版本的参考程序集目录。由于Windows SDK安装的副本和Visual Studio安装的副本不同,我只是从我的开发机器上复制了一份。可以正常工作。

最后需要注意的是:之所以会发生这种情况,可能是因为我们的构建服务器是一台老旧的Windows Server 2003。它太老了,无法处理Windows SDK的安装?


你说得对!谢谢。我有一台Server 2008 R1机器,无法安装Win 8 SDK或Visual Studio 2012。 - Simon_Weaver
2
在WS 2008 R2上运行.NET 4.5 Build时遇到了同样的问题。按照您的评论进行操作,问题得以解决!我不需要添加命令行参数,只需创建带有参考程序集的4.5文件夹即可。非常感谢! - kzfabi
3
对于.NET Framework v4和v4.5,我发现这非常有帮助,因为在64位系统上,“Program Files\Reference Assemblies”路径中的子文件夹没有填充(只有“Program Files(x86)\Reference Assemblies”子文件夹填充)。谢谢。 - Dan
我遇到了一个错误,提示缺少.NET 3.5 SP1,因此添加以下参数解决了这个问题。-p:FrameworkPathOverride="C:\Windows\Microsoft.NET\Framework\v2.0.50727" - Dave Stuart
在 Windows Server 2016 上安装 .NET Framework 4.6.2 开发人员包。https://www.microsoft.com/en-us/download/details.aspx?id=53321,然后使用 /p:FrameworkPathOverride="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1" - O. Jones

12

这看起来像是一个重复的问题:.NET 4.0 build issues on CI server,而且无论如何都应该按照那里的方法解决。

确保安装了 Windows 7 SDK,并且至少包括“Intellisense 和 Reference Assemblies”以及“Tools”两个 .NET 开发组件。如果它们已经安装但是引用程序集在您的磁盘上不存在,则需要卸载并重新安装这些组件。我已经在我的构建服务器上确认了这个解决方法。


1
使用此处提供的 Web 安装程序 http://www.microsoft.com/en-us/download/confirmation.aspx?id=8279,以避免下载整个 SDK。 - Oliver

2

补充cixelsyd的回答:

Windows SDK v7.1安装程序的默认设置是“智能感知和参考程序集”处于“半选中”状态 - 将其更改为完全选中即可消除警告:-)


1

这个对我有效,在powershell中运行它(不使用FrameworkPathOverride):

cp -r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\" "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"

因为4.5(或4.5.1)是4.0的插拔式替换。

3
你甚至可以使用 mklink 命令创建符号链接来代替复制操作。 - Ivan

0

-1

由于{{link1:.Net 4.0和.Net 4.5都使用CLR 4}},而且{{link2:.NET 4.5是.NET 4.0的就地替换},因此您可以安全地应用以下解决方案:

在该文件夹中:

    C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework

有一组文件夹,每个已安装的框架都有一个文件夹。 文件夹“v4.0”仅包含xml文件,而文件夹“v4.5”包含dll和xml文件。

我创建了一个符号链接到这个文件夹。

  1. 以管理员身份运行命令提示符。

  2. 运行以下脚本:

    cd C:\Program Files\Reference Assemblies\Microsoft\Framework.NETFramework ren v4.0 v4.0_old mklink /d v4.0 v4.5

创建了一个名为“v4.0”的符号文件夹,并指向v4.5的dll。

注意: 此解决方案不是net4的黑客方法,因为我介绍了为什么这个解决方案是安全的,我提供了从.NET 4.5 is an in-place replacement for .NET 4.0摘录的内容:

当安装.NET 4.5时,它会有效地取代机器上的.NET 4.0。 .NET 4.0被新版本的.NET 4.5覆盖,根据 Microsoft 的说法,这应该是100%向后兼容的。
当您安装.NET 4.5时,\Windows.NET Framework\V4.0.30319 中的.NET 4.0程序集将被新的程序集集合覆盖。您将获得已覆盖的程序集以及许多新程序集。
如果您打开.NET 4.5中System.dll程序集的属性,您还会看到:请注意,文件版本也保留在4.0.xxx上。
这个solution与我的方案类似,只不过它将程序集从net45复制到net4。

另请参阅.NET版本控制和多目标 - .NET 4.5是.NET 4.0的原地升级 注意:Net 4的生命周期已经结束,最好升级到net 4.5.2


这种方法太过于hacky,而且你创建了一个无效的.NET Framework 4.0配置文件(因为4.5有更多的API)。 - Lex Li
@LexLi,我更新了我的答案,以显示解决方案是安全的,而不是hacky。 - M.Hassan
不,你的编辑并没有使它成为一个有效的答案。你没有足够注意到.NET Framework 4.5确实引入了重要的新API表面,https://learn.microsoft.com/en-us/dotnet/framework/whats-new/#networking-因此,通过将引用的程序集从4.5复制到4.0,你有效地允许.NET Framework 4.0项目使用这些新的API,这是完全错误/不安全的,并违反了这些引用程序集的原始目标。这就是为什么人们应该遵循其他答案。"就地升级"意味着其他事情,而不涉及这个特定的位置。 - Lex Li
Net4的生命周期已经结束 - M.Hassan

-1

在搜索了多天的答案后,仔细查看了项目配置文件,并提到使用Windows 8.1 SDK重新安装缺失的4.5.1参考程序集的建议,最终成功解决了问题。

在我的情况下,我试图“启动不带调试”的新ASP.Net Core Web应用程序(.NET Core),旨在遵循tutorialhttps://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html

当使用SDK时,我取消了所有内容,除了参考程序集。这是我找到安装4.5.1的唯一方法,因为其他方法会失败,原因是我已经安装了4.5.2及更高版本。

真心感谢这篇文章提供的有用答案!

警告 MSB3644:未找到框架“ .NETFramework,Version = v4.5.1”的引用程序集。要解决此问题,请安装该框架版本的 SDK 或 Targeting Pack,或将应用程序重新定向到您已安装了 SDK 或 Targeting Pack 的框架版本。

这个问题严格针对.NET Framework 4.0,而不是4.5.x。 - Lex Li

-1

这些都不包括.NET Framework 4.0引用的程序集。 - Lex Li

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