C# sgen.exe x64.net c“因”而失败;“格式不正确的程序集”;
我有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位版本)时。我能够编译 我应该怎么做才能在vsC# 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
我是否可以为一个项目配置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,而另一个以某种方式连接但不同。