我和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版本)?
答案 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 sgen,Michael 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
似乎是一个内部属性,因此不是你可以依赖的东西。