【问题标题】:sgen.exe x64 .net c# fails with "assembly with an incorrect format"sgen.exe x64 .net c# 因“格式不正确的程序集”而失败
【发布时间】:2010-12-31 02:50:26
【问题描述】:

我有 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 版本)?

【问题讨论】:

标签: c# visual-studio 64-bit sgen


【解决方案1】:

这对您有帮助吗?看看他uses sgen as a post build的部分:

因此,您需要在 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-

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案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 项目的“打开”的“生成序列化程序集”下拉设置。

      【讨论】:

        【解决方案4】:

        this blog post 上发布了一个关于有条件地指定 __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 似乎是一个内部属性,因此不是您可以依赖的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-11
          • 2010-11-04
          • 2018-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多