SGEN:尝试加载格式不正确的程序集

Pau*_*ean 41 .net c# msbuild tfs

我有一个可以在我的本地机器上构建的项目,但是,当我得到TFS来构建它时,我收到以下错误 -

SGEN:尝试加载格式不正确的程序集:

在阅读了关于这个主题的许多其他帖子后,大多数人只是说我需要将构建类型更改为x86或任何CPU,而不是x64,但在尝试了无数组合之后,这不是解决方案.我的程序也是一个Windows服务,因此将应用程序池设置为允许32位应用程序(如其他人所建议的)也不是解决方案.

Pau*_*ean 16

这个页面终于解决了我的问题 - http://aplocher.wordpress.com/2012/10/12/sgen-an-attempt-was-made-to-load-an-assembly-with-an-incorrect-format -tfs-2010 /

为了防止该页面在将来消失,以下是涉及的步骤 -

  1. 在Team Explorer中,右键单击Build Definition并选择Open Process File Location
  2. 双击所选的XAML文件
  3. 在设计器中,选择名为Sequence的容器(这是包含其他所有内容的顶级容器).
  4. 在Arguments列表中(通常位于底部),将MSBuildPlatform从Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.Auto更改为Microsoft.TeamFoundation.Build.Workflow.Activities.ToolPlatform.X86.
  5. 保存并关闭文件.
  6. 将文件重新检入TFS并再次尝试构建.

  • 我的调试版本很好,但我的发布版本被破坏了(即使它们都使用相同的进程文件);这样做解决了它,谢谢。 (2认同)
  • 感谢您包括所涉及的步骤;WordPress博客不再可用。 (2认同)
  • .NET标准-我使用带有“生成序列化程序集= ON”的程序集和对标准程序集的引用的程序集来构建此Debug / AnyCPU。当我将其更改为“自动”时,错误消失了。 (2认同)
  • 它已经消失了,除非你回到https://web.archive.org/web/20130208032854/http://aplocher.wordpress.com/2012/10/12/sgen-an-attempt-was-made-to-加载带有错误格式的程序集-tfs-2010/ (2认同)

Tre*_*ice 13

当我搜索某些关键词时,这个问题仍然首先出现在谷歌中,所以我会发布这个以防有人发现它相关。

就我而言,我有一个项目在“调试”模式下构建得很好,但在“发布”模式下给出了OP的错误。该线程其他地方的解决方案都没有解决该问题。

然而,我在另一个论坛上遇到了一条关于 Web 服务引用干扰构建的晦涩评论。一个灯泡灭了。我的项目有许多不再使用的旧 Web 服务引用。所以我把它们撕掉了。你瞧,我现在可以在“发布”模式下构建项目,而无需禁用程序集序列化或摆弄 CSPROJ 或弄乱 Azure DevOps/VSTS 中的 SGEN 引用。

希望这可以节省某人的时间。

  • 不是所有的英雄穿着斗篷! (2认同)

Lou*_*ers 9

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

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

有时(如果那个没有帮助)旧版本有助于:

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

出于某种原因,64位版本的sgen不包含在Microsoft Build Tools中


mar*_*ark 8

我的答案是ola-eld\xc3\xb8y的扩展。就我而言,我不得不排除更多程序集,因为它们中的每一个都会产生相同的可怕错误:

\n
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)\n
Run Code Online (Sandbox Code Playgroud)\n

因此我的解决方案是扩展ola-eld\xc3\xb8y \ 的代码并将其保存在Directory.Build.targets中:

\n
<Project>\n  <ItemGroup>\n    <ReflectionOnlyAssemblyNames Include="Microsoft.Bcl.AsyncInterfaces"/>\n    <ReflectionOnlyAssemblyNames Include="System.Buffers"/>\n    <ReflectionOnlyAssemblyNames Include="System.Numerics.Vectors"/>\n    <ReflectionOnlyAssemblyNames Include="System.Runtime.CompilerServices.Unsafe"/>\n  </ItemGroup>\n  <Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">\n    <ItemGroup>\n      <_ReflectionOnlyAssembly_Names Include="@(_ReferencePath_Names)"\n                                     Condition="\'@(ReflectionOnlyAssemblyNames)\' == \'@(_ReferencePath_Names)\' And \'%(Identity)\' != \'\'"/>\n    </ItemGroup>\n    <ItemGroup>\n      <ReferencePath Remove="@(_DesignTimeFacadeAssemblies_Names->\'%(OriginalIdentity)\')" />\n      <ReferencePath Remove="@(_ReflectionOnlyAssembly_Names->\'%(OriginalIdentity)\')" />\n    </ItemGroup>\n    <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." />\n  </Target>\n  <Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">\n    <ItemGroup>\n      <ReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->\'%(OriginalIdentity)\')" />\n      <ReferencePath Include="@(_ReflectionOnlyAssembly_Names->\'%(OriginalIdentity)\')" />\n    </ItemGroup>\n    <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has run." />\n  </Target>\n</Project>\n
Run Code Online (Sandbox Code Playgroud)\n


TDN*_*TDN 7

当我尝试在Release中编译我的项目(Platform target设置为x86)时遇到了同样的错误.它在Debug中编译得很好.我发现在Release中,运行Generate序列化程序集; 因此,调用SGen实用程序.问题是MSBuild在我的x86 EXE上调用了SGen的x64版本,从而产生了错误.我不得不传递这个MSBuild参数,以便MSBuild使用正确版本的SGen:

/p:SGenToolPath="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools"
Run Code Online (Sandbox Code Playgroud)

  • 我有相反的问题。我的平台目标是 x64,但 VS 和 MSBuild 坚持使用 x86 工具(如 SGen)。 (2认同)

Ola*_*døy 7

我发现此问题相关:https: //github.com/dotnet/sdk/issues/1630

在等待在未来版本中修复此问题时,我能够通过向csproj文件添加两个目标来解决问题,如https://github.com/joperezr所示:

<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>
Run Code Online (Sandbox Code Playgroud)


Dav*_*ley 7

我今天也遇到了同样的问题。一个项目不能在我的PC上构建,但可以在其他PC上很好地构建

我最终通过执行以下操作修复了该问题:

右键单击出现错误的项目,进入“属性”

选择“构建”选项卡,然后转到最后一个选项“生成序列化程序集”,我将其设置为“关”,项目现在可以正常构建了。


Jon*_*der 5

就我而言,此错误不是由于 x86 / x64 设置的无效组合造成的,而是由于尝试构建针对特定 .NET Framework 版本 (v4.5.1) 的项目,而该版本的引用程序集尚未安装在构建服务器上。

以下两个条件的组合导致了该错误:

  1. 在 Visual Studio 中,在“项目属性”页面的“应用程序”选项卡上,“目标框架”设置为“.NET Framework 4.5.1”;
  2. 在构建服务器上的文件夹 中,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework存在名为 v4.5.1 的文件夹。(存在带有版本号的其他文件夹,包括 v3.5、v4.0 和 v4.5 。)

解决方法是在构建服务器上安装适用于 Windows 8.1 的 Windows 软件开发工具包 (SDK) 。在安装向导的“选择要安装的功能”步骤中,我取消选中除“.NET Framework 4.5.1 软件开发工具包”之外的所有复选框。

运行该安装会导致在 Reference Assemblies\Microsoft\Framework.NETFramework 文件夹中创建丢失的 v4.5.1 文件夹,并且构建会成功运行。