0

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

环境:

赢 7

VS2012 专业版

视窗 SDK 7.0

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

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

我用procmonfromsysinternals来追踪 SGEN

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

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

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

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

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

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

4

2 回答 2

0

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

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

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

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

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

于 2016-06-27T15:36:18.317 回答
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 框架 x64 路径,然后搜索引用的任务将在任何其他之前找到 x64 dll。

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

于 2021-06-19T09:16:33.893 回答