2

在目标框架为 3.5 的项目中,以下行使用 MsBuild 4.0 编译:

 aEnumerable.Select(aMethod);

但是 MsBuild 3.5 要求我写:

 aEnumerable.Select(item => aMethod(item));

这两个二进制文件都将在没有 .NET Framework 4.0 但使用 .NET 3.5 的机器上运行吗?

PS:虽然我展示了一个使用“方法重载推理”的示例,但其他“4.0”功能(例如“命名参数”)也会发生同样的情况。

这个问题的另一个标题可能是:哪些 C# 4.0/Visual Studio 2010 功能与 .NET 3.5 兼容?

4

2 回答 2

9

您混淆了 Msbuild 和 .NET 框架。

Msbuild 只是一个构建.NET 项目的工具。构建 .NET 4 项目需要版本 4.0,但它也可以执行 .NET 1.1、2.0、3.0、3.5、3.5 SP1。 就像使用 Word 2010 打开 Word 2003 文件一样。2010 会同时打开,但是如果你给它一个 2010 文件,2003 会崩溃

您的代码示例显示了在 4.0 版中添加到框架中的差异。您无法在未安装 .NET 4.0 框架的机器上执行 .NET 4 代码。不管是什么构建它,运行时都无法理解 CLR 并且它不会运行

至于 msBuild 本身: MsBuild 4.0 是一个新版本,主要更新为支持 .NET 4,但也有自己的功能。如果您需要这些详细信息,请查阅 msbuild4 的发行说明。

也就是说,只要正确配置了 targetFramework,MsBuild 4 就完全能够生成 .NET 3.5 输出。(早在我们将所有项目升级到 .NET 4 框架之前,我们就将所有构建移至 MsBuild 4.0)

于 2011-02-08T18:24:53.210 回答
1

如果您将安装定位到 .NET 3.5 SP 1 并且它可以工作,那么它将在只有 .NET 3.5 Service Pack 1 的机器上工作。如果您的目标不是 3.5 SP1,那么您应该这样做。

MSBuild 3.5 版与 .NET 3.5(和 Visual Studio 2008)捆绑在一起,允许为 2.0、3.0 或 3.5 .NET 版本支持(也称为“多目标”)构建 .NET 项目。

来源

我推测 MSBuild 4 将更新为也支持 .NET Framework 4.0。您当然应该在虚拟机上自己测试您的安装,并确保一切正常。

我只是想澄清一下,如果您想消除任何可能出现的兼容性问题,您应该使用 MsBuild 3.5 方法。我怀疑 MSBuild 4.0 会保留对旧方法的支持,但刚刚更新以支持 4.0 .NET Framework 中发生的更改。

类似于以下的命令应该可以工作

msbuild YourSolution.sln /tv:3.5 /p:TargetFrameworkVersion=v3.5 或

msbuild YourSolution.sln /p:TargetFrameworkVersion=v3.5 /tv (或 /toolsversion) 表示要使用的 MSBuild 工具的版本,属性 TargetFrameworkVersion 表示目标框架。在您的情况下,只需指定该属性就可以了,但如果您想使用 3.5 MSBuild 工具集,您可以像我在第一个命令中所做的那样使用 /tv 对其进行 sepcify。

来源

于 2011-02-08T17:16:56.900 回答