将网络框架 4.5.2 升级到 4.7.1 后生成错误"An attempt was made to load an assembly with an incorrect format "



我们正在尝试更新程序的框架。我们目前在 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 后,应删除此变通办法。

相关内容

最新更新