.net - MSBuild 使用错误版本的 sgen.exe 生成 XmlSerializer dll?

标签 .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 框架为目标。由于我们使用的是 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 会阻塞并中断构建。这实际上不是一个选择。
  • 尝试将注册表中的路径更改为工具 as discussed in this topic ,我没有看到任何变化。
  • 在服务器上安装VS2010。显然 VS2010 使用了中间 WinSDK v7.0A,他们获得它的唯一方法是在服务器上安装 VS2010。这实际上不是一个选择。
  • 将项目更改为不生成 XmlSerializer.dll。这可行,但看起来很俗气,因为它并没有真正解决问题,而且我还担心性能影响。

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

最佳答案

尝试将名为 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 位版本执行此操作。如果您有任何问题,请添加评论。

关于.net - MSBuild 使用错误版本的 sgen.exe 生成 XmlSerializer dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5252340/

相关文章:

c# - .NET WCF 序列化问题

visual-studio - 如何解决以下 C2220 错误?

powershell - 如何为 Azure 应用服务(如 Visual Studio 2015 UI)生成 pubxml 文件?

c# - 优雅地关闭系统托盘应用程序

c# - 在 Windows Docker 容器中设置语言和区域设置

c# - 如何从 sqlite 数据库检索 float 到 C# 文本框

visual-studio - VS11 模板是否应该通过 WinRT 应用程序认证工具包?

.net - MSbuild 的特点

c# - 为什么 "Sign the ClickOnce manifests"复选框在构建时默认选中?

c# - 在 ServiceModel 客户端配置部分找不到引用契约(Contract)的默认端点元素......................