sgen.exe x64 .net c#失败,“程序集格式不正确”

时间:2009-12-30 13:45:15

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

我和vs2008有ws2008 x64。

当我将我的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版本

我可以以某种方式为一个项目配置solutinon平台以指向正确的sgens(对于x86到32位以及x64到64位sgen版本)?

4 个答案:

答案 0 :(得分:4)

这会帮助你吗?看看他uses sgen as a post build

的部分
  

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

     

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

答案 1 :(得分:3)

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

使用post build事件,有条件地检查是否安装了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项目的“On”的“Generate Serialization Assemblies”下拉设置。

答案 2 :(得分:2)

添加一些预构建操作,只是为了转储在构建时生效的env变量。

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

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

答案 3 :(得分:1)

this blog post上发布了一个关于有条件地指定__SdkSgenTool的不同解决方案:

  

唯一缺少的是我需要将SGenToolPath设置为我的构建输出目录。这比预期更难,因为作为正常属性,它被其他MsBuild任务覆盖。最终确实起作用的解决方案是创建已存在的属性,并在没有其他任务干扰时将值设置为其最终值。

     

以下是让Sgen以64位工作的“代码”。您需要在所有构建模式中定义__SdkSgenTool变量,因为无论构建模式如何,都会执行像copy一样的后期构建步骤。

 <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似乎是一个内部属性,因此不是你可以依赖的东西。