Sgen和x64项目配置创建XML Serializers程序集

时间:2015-03-25 22:08:56

标签: .net visual-studio build msbuild sgen

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

环境:

赢7

VS2012 Pro

Windows SDK 7.0

在我们的环境中,我们生成2个代码库 - x86和x64。对于此特定项目,我们生成*.XMlSerializers.dll生成序列化程序集的构建中的设置为Auto

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

我使用procmon中的sysinternals跟踪SGEN

  1. 构建 AnyCpu x86 procmon 时会显示跟踪。正在使用的 sgen 来自C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin(32位sngen.exe)
  2. 构建 x64 时,没有跟踪,只有上面提到的错误
  3. 我设置项目配置以创建序列化器到 OFF 并在x64中编译汇编。然后我尝试了一个命令行

    1. C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\x64中使用SGEN取得了成功 - (请注意 - 这是64位sgen.exe)
    2. 在x64程序集上运行32位SGEN失败。
    3. 这些结果得出结论:当VS2012编译项目时,生成序列化程序集设置为打开自动是特殊情况) ,它试图找到 sgen.exe 。但是当您的项目配置设置为针对x64平台构建时,它无法找到适当的 sgen.exe ,它本身就是为x64构建的。

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

      我知道有关变通办法,即Post Build事件并将其关闭,但这不是重点。

2 个答案:

答案 0 :(得分:0)

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

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

但是为了以更广泛的,特定于环境的方式解决我的问题,我必须将生成序列化程序集设置为 OFF 并在构建后使用单独的命令行操作

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

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

答案 1 :(得分:0)

我们要求在编译时构建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 framework x64 路径放在任何其他路径之前,然后搜索引用的任务将在任何其他路径之前找到 x64 dll。

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