SGEN失败:尝试在VS2008中加载格式不正确的程序集

时间:2012-11-14 06:45:46

标签: visual-studio-2008 format mixed-mode web-reference sgen

我能够找到几个类似的问题并回答,但没有一个答案或确切条件适用于我的情况。

  1. 我有一个为x64构建的.NET 3.5项目。
  2. 我还有一个x64混合模式参考(也是针对.NET 3.5)。
  3. 在Visual Studio 2008中,我创建了一个Web引用,它使SGEN在Release构建期间执行以创建帮助程序DLL。
  4. 如果我没有引用mixed-mode DLL,这可以正常工作。如果我引用混合模式DLL,我会收到此错误(xxx只是一个占位符):

      

    SGEN:错误:尝试加载带有的程序集   格式不正确:   C:\代码\ XXX \树干\ XXX \共同\ XXX \建立\ winx64 \ lib中\ xxx.dll

    这是发出的命令:

      

    C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin \ sgen.exe   /assembly:C:\code\xxx\trunk\xxx\xxx\obj\x64\Release\xxx.dll   / proxytypes /reference:..:common\xxx\build\winx64\lib\xxx.dll   /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll   /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Configuration.Install.dll   / reference:“C:\ Program Files(x86)\ Reference   大会\微软\框架\ v3.5版本\ System.Core.dll”   /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll   /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll   /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.EnterpriseServices.dll   /reference:C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\System.Management.Automation.dll   / reference:“C:\ Program Files(x86)\ Reference   大会\微软\框架\ 3.0 \ System.Runtime.Serialization.dll”   / reference:“C:\ Program Files(x86)\ Reference   大会\微软\框架\ 3.0 \ System.ServiceModel.dll”   / reference:“C:\ Program Files(x86)\ Reference   大会\微软\框架\ v3.5版本\ System.Web.Extensions.dll”   /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.Services.dll   /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll

    有什么想法吗?

4 个答案:

答案 0 :(得分:32)

您是否尝试按this msdn post中的建议将Generate serialization assembly更改为Off?在我的情况下,那是票。

只需转到您的项目属性,它就在Build。

Project Properties - Build

答案 1 :(得分:3)

安装MSBuild Toolset后(对于Visual Studio 2013),此错误也会在构建计算机上弹出。问题是默认情况下只有32位版本的sgen.exe可用。

安装最新的Windows SDK后,问题就消失了,其中包括64位版本的sgen.exe:

http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx

在一个代理(机器)上我也需要安装旧版本:

http://msdn.microsoft.com/en-us/windows/desktop/hh852363.aspx

答案 2 :(得分:2)

在关闭序列化程序集时,将解决问题,它只是解决方法 - 最终你将以较慢的启动时间来支付它。问题是您必须从x64 SDK调用sgen.exe(如果您的目标是x64)。如果你正在使用msbuild,请像这样设置正确的sgen路径:

<MSBuild Projects="$(MSBuildProjectLocation)" Targets="Build"
    Properties="....
    SGenToolPath=C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\x64;" 
/>

答案 3 :(得分:2)

这是Ondrej's answer的替代方案。

我们刚刚对项目文件(csproj)中的Release配置进行了修改,并将SDK路径设置为x64版本:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    ...
    ...
    <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
    <SDK40ToolsPath>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64</SDK40ToolsPath>
  </PropertyGroup>