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 /
为了防止该页面在将来消失,以下是涉及的步骤 -
Tre*_*ice 13
当我搜索某些关键词时,这个问题仍然首先出现在谷歌中,所以我会发布这个以防有人发现它相关。
就我而言,我有一个项目在“调试”模式下构建得很好,但在“发布”模式下给出了OP的错误。该线程其他地方的解决方案都没有解决该问题。
然而,我在另一个论坛上遇到了一条关于 Web 服务引用干扰构建的晦涩评论。一个灯泡灭了。我的项目有许多不再使用的旧 Web 服务引用。所以我把它们撕掉了。你瞧,我现在可以在“发布”模式下构建项目,而无需禁用程序集序列化或摆弄 CSPROJ 或弄乱 Azure DevOps/VSTS 中的 SGEN 引用。
希望这可以节省某人的时间。
安装包含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中
我的答案是ola-eld\xc3\xb8y的扩展。就我而言,我不得不排除更多程序集,因为它们中的每一个都会产生相同的可怕错误:
\nCould 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)\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n
当我尝试在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)
我发现此问题相关: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)
我今天也遇到了同样的问题。一个项目不能在我的PC上构建,但可以在其他PC上很好地构建
我最终通过执行以下操作修复了该问题:
右键单击出现错误的项目,进入“属性”
选择“构建”选项卡,然后转到最后一个选项“生成序列化程序集”,我将其设置为“关”,项目现在可以正常构建了。
就我而言,此错误不是由于 x86 / x64 设置的无效组合造成的,而是由于尝试构建针对特定 .NET Framework 版本 (v4.5.1) 的项目,而该版本的引用程序集尚未安装在构建服务器上。
以下两个条件的组合导致了该错误:
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 文件夹,并且构建会成功运行。
| 归档时间: |
|
| 查看次数: |
32028 次 |
| 最近记录: |