MSBuild使用不正确的sgen.exe版本生成XmlSerializer dll?

时间:2011-03-09 21:22:59

标签: .net visual-studio msbuild teamcity

我正在使用TeamCity运行MSBuild脚本来清理和重建我们的解决方案之一。当我部署由此过程构建的dll时,Web服务器返回有关[MyType] .XmlSerializer.dll的错误,“此程序集由比当前加载的运行时更新的运行时构建,无法加载。”这是我到目前为止的笔记:

  • 该解决方案是针对.Net Framework 3.5的Visual Studio 2010解决方案。
  • TeamCity将设置为模仿此。它使用MSBuild版本 - “.Net Framework 4.0”和MSBuild ToolsVersion - “3.5”进行设置。这告诉TeamCity使用MSBuild 4.0但是要定位3.5 Framework。由于我们使用的是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.dlls。这是 正确吗

据我所知,我的选择是:

  • 如果我改变目标以使用较旧的v3.5,MSBuild工具,VS2010会在MSBuild 3.5的解决方案文件中添加警告并破坏构建。这不是一个真正的选择。
  • 尝试将注册表中的路径更改为工具as discussed in this topic,我看不到任何更改。
  • 在服务器上安装VS2010。显然VS2010使用了一个中间的WinSDK,v7.0A,他们唯一的办法就是在服务器上安装VS2010。这不是一个真正的选择。
  • 将项目更改为不生成XmlSerializer.dlls。这可行,但似乎很俗气,因为它并没有真正解决问题,我也担心性能影响。

我错过了什么吗?我错过了还有其他选择吗?

3 个答案:

答案 0 :(得分:4)

尝试将名为SGenToolPath的属性设置为您要使用的SGen工具。

Microsoft.Common.targets文件调用SGen任务,如下所示:

    <SGen
        BuildAssemblyName="$(TargetFileName)"
        BuildAssemblyPath="$(IntermediateOutputPath)"
        References="@(ReferencePath)"
        ShouldGenerateSerializer="$(SGenShouldGenerateSerializer)"
        UseProxyTypes="$(SGenUseProxyTypes)"
        KeyContainer="$(KeyContainerName)"
        KeyFile="$(KeyOriginatorFile)"
        DelaySign="$(DelaySign)"
        **ToolPath="$(SGenToolPath)"**
        SdkToolsPath="$(TargetFrameworkSDKToolsDirectory)"
        EnvironmentVariables="$(SGenEnvironment)"
        SerializationAssembly="$(IntermediateOutputPath)$(_SGenDllName)"
        Platform="$(SGenPlatformTarget)"
        Types="$(SGenSerializationTypes)">

    <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly"/>

  </SGen>

我依稀记得必须为64位版本执行此操作。如果您有任何问题,请添加评论。

答案 1 :(得分:1)

Windows SDK出现了令人不快的安装程序问题。检查this answer以获取正确的注册表项。

答案 2 :(得分:0)

在我的机器上,我发现正确的版本被称为 C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ bin \ sgen.exe ,但目标DLL不正确

我相信原因是由于我的sgen.exe.config,删除以下行有助于解决我的问题。

<startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>