我们正在努力更新我们计划的框架.我们目前在版本4.5.2中使用它,我们希望将其更新到版本4.7.1
我们已经更改了解决方案的所有csproj,当我们在debug中编译时,应用程序编译并正常工作.但是当我们在发布时执行它时,它会因以下错误而失败:
An attempt was made to load an assembly with an incorrect format: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\Facades\System.IO.Compression.ZipFile.dll
Run Code Online (Sandbox Code Playgroud)
我们真的不知道什么是错的,有谁知道它可能是什么?
非常感谢你.
更新:正如Josh在下面建议的那样,现在4.7.2可用,升级到.NET版本以获得此问题的最佳解决方案.
如果坚持使用4.7.1:这可能不是解决问题的根源,但是如果你想暂时解决这个问题,那么找到有问题的项目并编辑它的设置(rclick项目,'属性',然后'构建'标签.)
为发布模式将"生成序列化程序集"设置为"关闭".
如果它仍然抱怨,请尝试将以下<Target>s 添加到.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>
Run Code Online (Sandbox Code Playgroud)
问题的根源在于您在错误消息中看到的程序集在 .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>
Run Code Online (Sandbox Code Playgroud)
编辑:如果上述方法不起作用,请分享详细的 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>
Run Code Online (Sandbox Code Playgroud)
这仅适用于装有 .NET Framework 4.7.1 的计算机。安装。在该计算机上安装 .NET Framework 4.7.2 后,应删除此解决方法。
| 归档时间: |
|
| 查看次数: |
3302 次 |
| 最近记录: |