我有一个项目,在本地机器上可以很好地构建,但是当我让TFS来构建时,我收到了以下错误消息 -
SGEN:尝试使用不正确的格式加载程序集:
在阅读了许多其他相关帖子后,大多数人只说我需要将构建类型更改为x86或任何CPU,而不是x64,但是经过无数次尝试,这并不是解决方案。我的程序也是一个Windows服务,因此设置应用程序池以允许32位应用程序(如他人建议的)也不是解决方案。
我今天遇到了同样的问题。一个项目在我的电脑上无法构建,但在其他电脑上可以正常构建。
最终我通过以下方法解决了这个问题:
右击出错的项目,进入属性
选择“生成”选项卡,然后找到最后一个选项,“生成序列化程序集” 我将其设置为关闭,现在项目可以成功构建。
为了防止该页面在未来消失,以下是所涉及的步骤:
http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx
有时(如果那个方法不起作用),旧版本会有帮助:http://msdn.microsoft.com/en-us/windows/desktop/hh852363.aspx
由于某些原因,Microsoft Build Tools中没有包含64位版本的sgen。我发现这个问题很相关: https://github.com/dotnet/sdk/issues/1630
在等待这个问题被未来版本修复的同时,我按照https://github.com/joperezr的建议,在csproj文件中添加了两个目标以解决这个问题:
<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Remove="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
</ItemGroup>
<Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." />
</Target>
<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
</ItemGroup>
<Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has run." />
</Target>
SGenToolPath
修复程序,最终成功构建。所以也尝试一下这个选项吧! - Quango当我尝试在Release模式下编译我的项目(平台目标设置为x86)时,我遇到了相同的错误。在Debug模式下编译是没问题的。后来我发现,在Release模式下,会运行生成序列化程序集;因此会调用SGen实用程序。问题在于MSBuild针对我的x86 EXE调用了x64版本的SGen,导致出现错误。我必须传递这个MSBuild参数,以便MSBuild使用正确版本的SGen:
/p:SGenToolPath="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools"
Could not load file or assembly bla-bla-bla or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)
<Project>
<ItemGroup>
<ReflectionOnlyAssemblyNames Include="Microsoft.Bcl.AsyncInterfaces"/>
<ReflectionOnlyAssemblyNames Include="System.Buffers"/>
<ReflectionOnlyAssemblyNames Include="System.Numerics.Vectors"/>
<ReflectionOnlyAssemblyNames Include="System.Runtime.CompilerServices.Unsafe"/>
</ItemGroup>
<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
<ItemGroup>
<_ReflectionOnlyAssembly_Names Include="@(_ReferencePath_Names)"
Condition="'@(ReflectionOnlyAssemblyNames)' == '@(_ReferencePath_Names)' And '%(Identity)' != ''"/>
</ItemGroup>
<ItemGroup>
<ReferencePath Remove="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
<ReferencePath Remove="@(_ReflectionOnlyAssembly_Names->'%(OriginalIdentity)')" />
</ItemGroup>
<Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." />
</Target>
<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
<ReferencePath Include="@(_ReflectionOnlyAssembly_Names->'%(OriginalIdentity)')" />
</ItemGroup>
<Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has run." />
</Target>
</Project>
根据@james-white的批准答案中的一个评论,以下方法对我有效:
在项目文件中将GenerateSerializationAssemblies属性从"On"更改为"Auto"
想将这个建议整理成答案,让那些只是浏览的人更明显地看到。谢谢James White
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\
)。这是从TargetFrameworkSDKToolsDirectory分配的。查看目标文件,这来自SDK40ToolsPath。而且这是从MSBuild的.config文件设置的。C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\MSBuild.exe.config
(需要管理员权限)解决了这个问题,使用设置SDK40ToolsPath属性。<property name="SDK40ToolsPath" value="$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.6.2\WinSDK-NetFx40Tools-x64', 'InstallationFolder', null, RegistryView.Registry32))" />