【发布时间】:2011-05-28 18:38:15
【问题描述】:
我有一个 ASP MVC 2 项目,最初是用 VS 2008 编写的,但现在已升级到 VS 2010。但是,我希望继续使用 .net 3.5,因为生产环境并不总是安装 .net 4。我认为这是可能的。当我升级项目时,我对升级 .net 框架版本的问题回答为“否”。我已经检查并在项目的高级编译选项中将 .net 3.5 设置为目标框架。
我的问题是我可以编写在 VS 中构建和运行良好但在 .net 3.5 环境中不起作用的代码。例如,我添加了一个带有整数类型可选参数的函数? (可为空的整数)。这似乎在 4 中允许,但在 3.5 中不允许?无论如何,在 VS 2010 中运行良好。但是,当我尝试构建和部署时,我遇到了两个问题之一。 (我们使用自定义构建/部署脚本 - 在单独的构建服务器上构建使用 msbuild。)
问题 1 是如果我尝试使用 3.5 版本的 msbuild。然后构建失败并显示消息 “错误 BC31405:可选参数不能具有结构类型。”。
问题 2 是如果我尝试在构建服务器上使用 .net 4 版本的 msbuild(请记住,目标框架仍然是 3.5,唯一的变化是构建脚本使用的 msbuild 可执行文件)。在这种情况下,它会构建,但是当我尝试在安装了 3.5 但未安装 .net 4 的服务器上运行该站点时,我收到错误 “无法加载文件或程序集 'ProjectName.XmlSerializers' 或其依赖项之一. 此程序集由比当前加载的运行时更新的运行时构建,无法加载。"
根据 MSDN (http://msdn.microsoft.com/en-us/library/bb398202.aspx),我需要做的就是确保目标框架是正确的(以及引用,但没有那里似乎是一个问题,只要我避免某些语法等,它就可以很好地针对 3.5 构建。)
问题是我在 VS 中没有错误告诉我如果我使用那些不会构建的结构可能会出现问题。根据 MSDN (http://msdn.microsoft.com/en-us/library/bb398197.aspx) Visual Studio Multi-Targeting Overview 文章,当您处理项目时Visual Studio 以 .NET Framework 的早期版本为目标,在开发环境中动态地进行更改,如下所示...它使用适当版本的编译器和适当的编译器选项进行编译和构建"那么为什么它在 VS 中编译而不是在 msbuild 中编译呢?
我想知道问题是否出在工具集属性上(如果我在 msbuild 4 的命令行中指定 /tv:3.5,我会遇到与 msbuild 3.5 相同的构建错误)。根据 MSBuild Multitargeting 文章 (http://msdn.microsoft.com/en-us/library/ee395432.aspx)“您可以通过设置项目文件的项目元素”。但是,如果我将 .vbproj 文件中的 ToolsVersion="4.0" 更改为 ToolsVersion="3.5",则会弹出 Visual Studio 转换向导当我尝试重新加载项目时。
那么,我该怎么做:
A - 让 VS 2010 接受它是一个 .net 3.5 项目并使用适当的后台编译器,因此在开发过程中(在它到达构建服务器之前)向我显示错误?
或
B - 构建项目的方式是这样的(例如使用 msbuild 4),它可以构建但仍然在仅 .net 3.5 的环境中运行?
【问题讨论】:
标签: visual-studio-2010 .net-3.5 msbuild