【问题标题】:Sgen and x64 project configuration to create XML Serializers assemblySgen 和 x64 项目配置以创建 XML Serializers 程序集
【发布时间】:2015-05-29 19:44:13
【问题描述】:

看起来有很多类似的问题没有很好的解释。

环境:

赢 7

VS2012 专业版

Windows SDK 7.0

在我们的环境中,我们生成 2 个代码库 - x86 和 x64。对于这个特定的项目,我们生成*.XMlSerializers.dllGenerate Serialization Assemblies 在构建中的设置是Auto

当我将项目编译为 x64 配置时,我收到 SGEN 错误“尝试以不正确的格式加载程序集... system.data.dll”。此错误完全具有误导性,因为进一步调查得出以下结果:

我使用来自sysinternalsprocmon 来追踪SGEN

  1. AnyCpux86 构建时,procmon 会显示跟踪。正在使用的 sgen 来自 C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin (32-bit sngen.exe)
  2. x64 构建时,没有任何痕迹,只有上面提到的错误

我将项目配置设置为 OFF 并在 x64 中编译程序集以创建序列化程序。然后我尝试了一个命令行

  1. 成功来自于在C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\x64 中使用 SGEN -(请注意 - 这是 64 位 sgen.exe)
  2. 在 x64 程序集上运行 32 位 SGEN 失败。

这些结果得出一个结论:当VS2012编译一个Generate Serialization Assemblies设置为ON的项目时(auto是一个特例) ,它会尝试查找 sgen.exe。但是,当您的项目配置设置为为 x64 平台构建时,它无法找到合适的 sgen.exe,它本身就是为 x64 构建的。

问题:是否有 msbuild 配置或注册表设置或其他可以设置为允许 Visual Studio 找到合适的 SGEN 的东西?

我知道解决方法,即发布构建事件并将其关闭,但这不是重点。

【问题讨论】:

标签: .net visual-studio build msbuild sgen


【解决方案1】:

一般来说,可以将此XML添加到项目文件中的特定配置中,这将指向您想要的特定sgen.exe

<SGenToolPath>C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\x64</SGenToolPath>

但为了以更广泛、特定于环境的方式解决我的问题,我必须将 Generate Serialization Assembly 设置为 OFF 并在构建后使用单独的命令行操作 p>

"path to your specific\sgen.exe" "path\yourFile.dll" /f

我不得不这样做,因为这里的许多开发人员使用不同版本的 VS studio 等。他们设置他们的机器,谁知道他们安装什么以及安装在哪里。因此,我在构建过程中添加了一个特定操作来单独执行此步骤,因为我确切地知道特定 sgen.exe 在构建服务器上的位置。

【讨论】:

    【解决方案2】:

    我们需要在编译时构建 xml 序列化器,所以我们没有选择不使用创建序列化任务。

    但此问题与 Sgen.exe 的位置无关,而是与执行 msbuild 目标时的引用路径构建有关 GetReferenceAssemblyPaths

    我们终于解决了在每个 .csproj 文件中导入 csharp 目标后追加新目标的问题

      <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    

    下一个 xml 片段解决了这个问题:

    <Target Name="Prependx64FrameworkPath" Condition="'$(Platform)' == 'x64'" AfterTargets="GetReferenceAssemblyPaths">
        <Message Importance="normal" Text="Fixing target framework directory for x64 build before running SGen." />
        <PropertyGroup>
            <TargetFrameworkDirectory>C:\Windows\Microsoft.NET\Framework64\v2.0.50727;$(TargetFrameworkDirectory)</TargetFrameworkDirectory>
        </PropertyGroup>
       </Target>
    

    此片段强制在任何其他之前添加 .net 框架 x64 路径,然后搜索引用的任务将在任何其他之前找到 x64 dll。

    在每个 .vcproj 上添加此内容后,sgen 在构建 x64 二进制文件时成功完成。

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 2011-03-22
      • 1970-01-01
      • 2015-10-03
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多