看起来有很多类似的问题没有很好的解释。
环境:
赢7
VS2012 Pro
Windows SDK 7.0
在我们的环境中,我们生成2个代码库 - x86和x64。对于此特定项目,我们生成*.XMlSerializers.dll
。 生成序列化程序集的构建中的设置为Auto
。
当我将项目编译为x64配置时,我得到SGEN错误“尝试以不正确的格式加载程序集... system.data.dll”。这个错误完全是误导,因为进一步的调查带来了以下结果:
我使用procmon
中的sysinternals
跟踪SGEN
C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin
(32位sngen.exe)我设置项目配置以创建序列化器到 OFF 并在x64中编译汇编。然后我尝试了一个命令行
C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\x64
中使用SGEN取得了成功 - (请注意 - 这是64位sgen.exe)这些结果得出结论:当VS2012编译项目时,生成序列化程序集设置为打开(自动是特殊情况) ,它试图找到 sgen.exe 。但是当您的项目配置设置为针对x64平台构建时,它无法找到适当的 sgen.exe ,它本身就是为x64构建的。
问题:是否有 msbuild 配置或注册表设置或其他设置可以设置为允许Visual Studio找到合适的SGEN?
我知道有关变通办法,即Post Build事件并将其关闭,但这不是重点。
答案 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 二进制文件时成功完成。