在将net framework 4.5.2升级到4.7.1之后,构建错误"尝试加载具有不正确格式的程序集"

Mel*_*rel 6 c# .net-4.7.1

我们正在努力更新我们计划的框架.我们目前在版本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)

我们真的不知道什么是错的,有谁知道它可能是什么?

非常感谢你.

ofl*_*ero 9

更新:正如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)

  • 我已在两个项目中将发布模式的“生成序列化程序集”设置为“关闭”,现在它可以正常工作。非常感谢。 (3认同)
  • 这是 [Serialized] 类的性能构建步骤。将设置设置为“关闭”基本上是说 - 信任运行时可用的序列化类,因此它不会影响您的实际代码输出。我在本地构建时也遇到了这个问题,但 VSTS 托管的构建服务器(Visual Studio Online)没有问题。所以这是一个“构建机器”问题。大概是因为 VSTS 使用了一个很好的容器化的干净构建环境,而不是我那台肮脏的旧笔记本电脑,用 DLL 更新了一百万次。:) (2认同)
  • 对于那些仍然遇到此错误的人(例如我),新的解决方法是安装 .net 4.7.2 Developer Pack。来源; https://github.com/dotnet/sdk/issues/1630#issuecomment-415811457 (2认同)

Ale*_*SFT 5

问题的根源在于您在错误消息中看到的程序集在 .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 后,应删除此解决方法。