强制Microsoft Build Tools 2015将mscorlib纳入框架的目标版本,而不是4.6

本文关键字:版本 目标 框架 Tools Build Microsoft 2015 mscorlib 强制 | 更新日期: 2023-09-27 18:24:15

我在Visual Studio 2015中编写了一个应用程序,该应用程序使用C#6.0功能并以.NET 4.5.2为目标。当我使用Microsoft build Tools 2015构建它时,也就是我们的TeamCity服务器所做的,生成的bin文件夹还包含mscorlib.dll的副本。这里的问题是要复制的mscorlib.dll是.NET 4.6 DLL,这会在运行时引发问题。

为了解决这个问题,我用新的字符串插值语法替换了对string.Format()的调用。然而,这掩盖了根本问题,而不是解决它:为什么.NET 4.6 DLL包含在我的构建中,以及我如何强制4.5.2 DLL包含在它的位置?

如果你对这给我带来的运行时问题感兴趣,它会导致我的:

string.Format(CultureInfo.InvariantCulture, "{0}='{1}'", "key", "value")

被解释为(链接——它只存在于.NET 4.6中):

System.String System.String.Format(System.IFormatProvider, System.String, System.Object, System.Object)

代替(链接):

System.String System.String.Format(System.IFormatProvider, System.String, params System.Object[])

强制Microsoft Build Tools 2015将mscorlib纳入框架的目标版本,而不是4.6

当您在TeamCity生成代理上生成解决方案时,TeamCity会使用您在该代理上安装的MSBuild版本。创建MSBuild的每个版本都是为了生成针对特定版本.NET的DLL。例如,我认为MSBuild 2015针对的是.NET 4.6。

为了使用MSBuild 2015构建以.NET 4.5.2为目标的DLL,您还需要安装所谓的.NET 4.5.2目标包(在某些地方也称为开发包):

  • https://www.microsoft.com/net/download/visual-studio-sdks
  • 什么';.NET Framework SDK和Targeting包之间的区别是什么

如果你没有安装目标软件包,并试图使用错误的构建工具针对旧版本的.NET进行构建,就像我的情况一样,那么MSBuild 2015试图通过它所知道的唯一方式进行构建来进行补偿:遵循.NET 4.6的规则(无论如何都应该向后兼容4.5.2),并在构建文件夹中放入.NET DLL(mscorlib.DLL)。

在大多数情况下,这仍然可以很好地工作,除了我的代码使用了String.Format(),它在4.5.2和4.6之间发生了非常微妙的中断变化。