我们正在尝试更新程序的框架。我们目前在 4.5.2 版中有它,我们希望将其更新到版本 4.7.1
我们已经更改了解决方案的所有csproj,当我们在调试中编译时,应用程序可以编译并正常工作。但是当我们在发布中执行此操作时,它会因以下错误而失败:
An attempt was made to load an assembly with an incorrect format: C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.7.1FacadesSystem.IO.Compression.ZipFile.dll
我们真的不知道出了什么问题,有谁知道它可能是什么?
谢谢。
更新:正如 Josh 在下面建议的那样,现在 4.7.2 可用,请升级到该 .NET 版本以最好地解决此问题。
如果坚持使用 4.7.1:这可能没有解决问题的根源,但如果您想暂时解决这个问题,请找到有问题的项目并编辑其设置(rclick 项目,"属性",然后"构建"选项卡。
在发布模式下将"生成序列化程序集"设置为"关闭"。
如果它仍然抱怨,请尝试将以下<Target>
添加到您的 .csproj 文件中(例如,在底部,就在封闭的 </Project>
根标记内:
<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>
此问题已在最新的 .net 开发包 4.7.2 中修复:
https://github.com/dotnet/sdk/issues/1630#issuecomment-415811457
https://www.microsoft.com/net/download/thank-you/net472-developer-pack
问题的根源是您在错误消息中看到的程序集在 .NET Framework 统一表中具有不正确的条目。
该不正确的条目会导致程序集引用无法与框架中的程序集正确统一,并导致该错误。这在 .NET Framework 4.7.1 中记录为已知问题。
作为解决方法,您可以将这些目标添加到项目中。他们将从传递给 SGEN 的引用列表中删除DesignFacadesToFilter
(并在 SGEN 完成后重新添加它们(
<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
<ItemGroup>
<DesignFacadesToFilter Include="System.IO.Compression.ZipFile" />
<_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')"
Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" />
<ReferencePath Remove="@(_FilterOutFromReferencePath)" />
</ItemGroup>
<Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." /> </Target>
<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
<ItemGroup>
<ReferencePath Include="@(_FilterOutFromReferencePath)" />
</ItemGroup>
<Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has ran." />
</Target>
编辑:如果上述方法不起作用,请分享详细的msbuild日志,以帮助了解目标不起作用的原因。
另一个选项(计算机范围(是将以下绑定重定向添加到 sgen.exe.config:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
这仅适用于安装了 .NET Framework 4.7.1 的机器。在该计算机上安装 .NET Framework 4.7.2 后,应删除此变通办法。