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

Bri*_*lis 6 .net msbuild teamcity visual-studio

我正在使用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停止运行并破坏了构建。这不是真正的选择。
  • 尝试将注册表中的路径更改为本主题中讨论的工具,但看不到任何更改。
  • 在服务器上安装VS2010。显然,VS2010使用了中间的WinSDK v7.0A,而获得此功能的唯一方法是在服务器上安装VS2010。这不是真正的选择。
  • 更改项目以不生成XmlSerializer.dlls。这行得通,但看起来有点俗气,因为它并不能真正解决问题,我也担心性能问题。

我想念什么吗?我还有其他选择吗?

Rit*_*ton 6

尝试将名为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>
Run Code Online (Sandbox Code Playgroud)

我隐约记得要对64位版本执行此操作。如果有任何问题,请添加评论。