12

我有 ws2008 x64 和 vs2008。

当我将 vs 设置为 x64(因为我有 64 位 dll)并运行编译时,sgen 说

试图加载格式不正确的程序集

VS takse sgen 来自 C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\

我认为它应该从 C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\x64\

当我将 64 位版本的 sgen 放入 C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ (替换 32 位版本)时。我能够编译。

我应该怎么做才能在 vs 下指向正确版本的 sgen

我可以以某种方式为一个项目配置解决方案平台以指向正确的 sgen(x86 到 32 位和 x64 到 64 位 sgen 版本)?

4

4 回答 4

4

这对你有帮助吗?看看他使用 sgen 作为后期构建的部分:

因此,您需要在 VS 项目属性的 Build Events 选项卡上添加 SGen 命令作为自定义构建后事件:

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /force /assembly:"$(TargetPath)" /compiler:/keycontainer:VS_KEY_5EFB7881D71082EDCF85DBBFCD748B9A /compiler:/delaysign-

于 2010-08-11T21:01:01.630 回答
3

这是我能找到的最佳答案:Conditional Post-Build Event Command for x64 sgenMichael Hanes的博客文章。

使用构建后事件,有条件地检查是否安装了 64 位 SGEN,并在需要时使用它:

REM Use the 64-bit sgen from the Win 2008 and 
REM .NET 3.5 SDK in a 64-bit dev environment
REM ProgramFiles variable is set to 
REM 'Program Files (x86)' in a x64 environment 
REM Processor_Architecture variable returns x86 
REM in both an x86 and x64 environment within VS.

if /I "%ProgramFiles%" == "C:\Program Files" (
set SgenToolPath="C:\Program Files\Microsoft
SDKs\Windows\v6.0A\Bin\sgen.exe"
) else (
set SgenToolPath="C:\Program Files\Microsoft
SDKs\Windows\v6.1\Bin\x64\sgen.exe"
)

%SgenToolPath% /compiler:"\"/keyfile:$(ProjectDir)
MyKeyFile.snk"\" /force "$(TargetPath)"

这旨在替代给定 Visual Studio 项目的“打开”的“生成序列化程序集”下拉设置。

于 2010-08-17T18:10:15.770 回答
2

添加一点预构建操作只是为了转储在构建时有效的环境变量。

检查 vcvarsall.bat 并按照它为不同的主机/构建平台组合加载其他 bat-s。

检查 devenv 进程的实际位数(例如使用进程资源管理器)。

于 2010-08-12T12:49:31.890 回答
1

此博客文章上发布了一个关于有条件指定的不同解决方案__SdkSgenTool

唯一缺少的是我确实需要将 SGenToolPath 设置为我的构建输出目录。这正如预期的那样更难,因为作为一个普通属性,它被其他 MsBuild 任务覆盖。最终奏效的解决方案是创建已经存在的属性,并在没有其他任务可以干扰的情况下将值设置为其最终值。

下面是使 Sgen 在 64 位下工作的“代码”。您需要在所有构建模式中定义 __SdkSgenTool 变量,因为无论构建模式如何,都会执行诸如复制之类的构建后步骤。

 <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
   ....
    <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
    <SGenUseProxyTypes>false</SGenUseProxyTypes>
    <__SdkSgenTool Condition="exists('C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe')">C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe</__SdkSgenTool>
    <__SdkSgenTool Condition="exists('C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe')">C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe</__SdkSgenTool>
  </PropertyGroup>
...

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="BeforeBuild">
    <Copy SourceFiles="$(__SdkSgenTool)" DestinationFiles="$(TargetDir)\sgen.exe" SkipUnchangedFiles="true" />
    <CreateProperty Value="$(TargetDir)">
      <Output TaskParameter="Value" PropertyName="SGenToolPath" />
    </CreateProperty>

我听说这个问题将在 VS2012 中得到解决,这是一件好事。

这似乎没有在 VS2012 中修复。我会谨慎使用它,因为它__SdkSgenTool似乎是一个内部属性,因此不是你可以依赖的东西。

于 2015-05-28T18:06:46.743 回答