我正在使用TeamCity运行一个MSBuild脚本来清理和重建我们的解决方案之一。当我部署此过程构建的dll时,Web服务器会返回一个关于[MyType].XmlSerializer.dll的错误,指出“该程序集是由一个比当前加载的运行时更新的运行时构建的,因此无法加载。” 我目前的笔记如下:
- 该解决方案是一个 Visual Studio 2010 解决方案,目标为 .Net Framework 3.5。
- TeamCity设置为模拟这个。 它设置了 MSBuild 版本 - “.Net Framework 4.0” 和 MSBuild ToolsVersion - “3.5”。 这告诉TeamCity使用MSBuild 4.0,但针对3.5框架。 因为我们使用Visual Studio 2010,所以必须使用MSBuild 4.0,否则会产生其他错误(与VS2010使用的新警告代码相关)。 这似乎正常工作,并为大多数dll生成 .Net 3.5的dll。
- MSBuild进程调用resgen.exe和sgen.exe来分别生成资源文件和XmlSerializer文件。 由于我们使用的是MSBuild 4.0,它会查找Windows SDK 7.1。 我已经安装了那个版本。 我还安装了Windows SDK 7.0。
- 无论我选择什么框架,构建过程都会调用WinSDK 7.1下的 sgen.exe 并生成 .Net Framework 4.0 的[MyType].XmlSerializer.dll文件。 这是否正确?
就我所知,我的选择如下:
- 如果我更改为针对旧版本的 v3.5 MSBuild 工具,则VS2010已在解决方案文件中放置警告,MSBuild 3.5无法识别并破坏构建。 这不是一个真正的选择。
- 尝试更改注册表中的路径到工具(如本主题中所讨论的),我没有看到任何更改。
- 在服务器上安装VS2010。 显然,VS2010使用了一种中间的 WinSDK,即v7.0A,而获得该选项的唯一方法是在服务器上安装VS2010。 这不是一个真正的选择。
- 更改项目以不生成XmlSerializer.dlls。 这个方法可行,但似乎有点牵强,因为它并未真正解决问题,我也担心性能影响。
我有遗漏的吗? 有其他选择吗?