如何让开发人员使用VS2008针对.NET 2.0进行开发(但不是服务包),以避免运行时崩溃?

4
所以,我想将我的开发团队升级到VS2008。作为一个企业,我们还没有推出3.5运行时。
根据一些阅读,安装VS2008似乎会自动提供.net 2.0 SP1,其中包含一些新的API,当您针对2.0运行时目标时,它将假定2.0 SP1。
但是,如果SP1尚未推出给我们的用户,这将导致运行时错误。
1. 是否有任何方法使VS针对dotnet 2.0(非SP1)进行目标设置? 2. 是否有其他解决方案以解决此问题,使开发人员不使用在本地编译和运行良好但在生产中出现问题的API?
我看到fxcop对此进行了检查,但必须有更加可靠的解决方案来解决此问题。
2个回答

1
这可能有些难也可能很简单。我们两种方式都尝试过:
  • 简单的方法:建立一个只安装了.NET 2.0的构建服务器。自动化构建在提交后运行(我们使用CruiseControl.Net)。你需要使用命令提示符下的MSBuild来构建项目。
  • 对于已安装了3.5的机器,即使从.NET 2.0框架目录运行MSBuild,也会替换掉许多MSBuild工具。为了避免这种情况,你必须创建一个应用程序,强制继续使用只有.NET 2.0运行时。这并不容易。我们直接加载项目,并使用Microsoft.Build.*框架调用构建。但仅仅这样还不够。你必须在.config文件中固定要使用的程序集:
  • <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="2.0.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.Build.Engine" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="2.0.0.0"/> </dependentAssembly> ... 等等 ... </assemblyBinding> </runtime> </configuration>

顺便提一下,你在使用VS2008新建项目时可能会遇到一个名为"MSBuildToolsPath"的属性缺失问题,该属性必须被定义。如果你使用MSBuild,可以在命令行上进行定义,或者如果使用第二个选项,则可以通过编程方式进行指定。

engine.GlobalProperties.SetProperty( "MSBuildToolsPath", msbuildPath );

你的第一个建议不会有帮助,因为那些 SP1 不兼容性会在运行时导致 MissingMethodExceptions。 - PVitt
如果构建服务器没有安装SP1,那么在编译时这些方法也不存在。 - Adam Sills
正如Adam所评论的那样,你没有在构建服务器上安装SP1是这个问题可以工作的原因。实际上我们也不在构建服务器上安装VStudio,这使得我们的构建服务器尽可能接近最终用户环境。 - csharptest.net

0

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