C# sgen.exe x64.net c“因”而失败;“格式不正确的程序集”;

C# sgen.exe x64.net c“因”而失败;“格式不正确的程序集”;,c#,visual-studio,64-bit,sgen,C#,Visual Studio,64 Bit,Sgen,我有ws2008 x64和vs2008 当我将vs设置为x64(因为我有64位DLL)并运行编译时,sgen说 试图加载格式不正确的程序集 VS takse sgen来自 C:\Program Files\Microsoft SDK\Windows\v6.0A\bin\ 我认为它应该从 C:\Program Files\Microsoft SDK\Windows\v6.0A\bin\x64\ 当我将64位版本的sgen放入C:\Program Files\Microsoft SDK\Window

我有ws2008 x64和vs2008

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

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

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

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

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

我应该怎么做才能在vs


我是否可以为一个项目配置SolutionOn平台,以指向正确的sgen(对于x86到32位,对于x64到64位的sgen版本)?

这对您有帮助吗?请看一节,他:

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

“C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe”/force/assembly:“$(TargetPath)”/compiler:/keycontainer:VS_KEY\u 5EFB7881D71082EDCF85DBBFCD748B9A/compiler:/delaysign-


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

检查vcvarsall.bat,并在加载不同主机/构建平台组合的其他bat-s时遵循它


检查devenv进程的实际比特数(比如使用process explorer)。

这是我能找到的最好答案:,作者的博客文章

使用生成后事件,有条件地检查是否安装了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项目“打开”的“生成序列化程序集”下拉设置。

上发布了一个关于有条件指定
\uu SdkSgenTool
的不同解决方案:

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

下面是使Sgen在64位中工作的“代码”。您需要在所有构建模式中定义uuu 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>

....
在…上
假的
C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe
C:\Program Files\Microsoft SDK\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\sgen.exe
...
我听说VS2012将解决这个问题,这是一个很好的解决方案 事情


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

已经在本线程中讨论过:不完全,这里的问题是关于如何强制VS使用x64 sgen,而另一个以某种方式连接但不同。