2009-12-30 26 views
12

我有vs2008的ws2008 x64。sgen.exe x64 .net c#以“装配不正确的格式”失败

当我把我的VS到x64(因为我有64位DLL)和运行编译SGEN说

试图格式不正确

VS takse从 ÇSGEN加载程序集:\ Program Files文件\微软的SDK \的Windows \ v6.0A \ BIN \

,我认为应该把它从 C:\ Program Files文件\微软的SDK \的Windows \ v6.0A \ BIN \ 64 \

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

我应该怎么做指向SGEN的正确版本下与

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

+0

已在此主题中讨论:http://stackoverflow.com/questions/1978340/visualstudio-c-x64-why-addreference-option-net-tab-points-to-x86-dll-instead/1978612#1978612 – 2009-12-30 18:15:23

+1

不完全,这里的问题是关于如何强制VS使用x64 sgen,而另一个是以某种方式连接但不同。 – Darqer 2009-12-30 21:46:49

回答

3

这是我能找到的最佳答案:Conditional Post-Build Event Command for x64 sgen,由Michael 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项目的“On”。

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-

2

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

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

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

1

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