12

我无法让 Visual Studio 在发布模式下构建我的项目......它给了我关于程序集格式错误的错误。结果是一些 x86 程序集被引用而不是 x64 程序集。PresentationCore、System.Data 等程序集。

我尝试过的事情:

  • 调试模式,任何 CPU 都可以正常构建。

  • 调试模式,x64 构建良好。

  • 释放模式,任何 CPU 出现故障

  • 发布模式,x64 失败(这是我想要构建项目的组合)

当我尝试删除 x86 引用并将其切换到 x64 引用时,问题就出现了。Visual Studio 只是添加旧的 x86 引用而不是 x64 引用。例如:

我删除了其中的 System.Data 引用C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll

我浏览并添加C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Data.dll,但是当我单击该 System.Data 引用时,路径显然仍然指向旧 dll 并导致发生相同的错误。这也发生在其他几个 DLL 中。

有谁知道这个问题的解决方案?

4

5 回答 5

18

PresentationCore、System.Data 等程序集。

我讨厌在没有看到错误消息的情况下回答问题。但这个次要证据足以回答这个问题。首先,这不是错误,而是警告。它看起来像这样:

警告 CS1607:程序集生成 -- 引用的程序集“System.Data.dll”针对不同的处理器

您还将看到一个用于 mscorlib.dll 的文件。以及 WPF 项目中的 PresentationCore.dll。这里发生的是这些程序集是特殊的,它们是混合模式程序集。换句话说,它们包含本机代码和托管代码。本机代码是麻烦制造者,这样的程序集只能在针对正确处理器风格的项目中使用。如果你把它混在一起,那么你会在运行时得到一个 BadImageFormatException 。

这不是 .NET 程序集的真正问题,您的机器实际上在 GAC 中存储了这些 DLL 的两个版本。如果您的程序在 32 位模式下运行,将使用一个,另一个在 64 位模式下使用。CLR 会自动选择正确的。

但是,只有一个版本的引用程序集,即存储在 c:\windows\microsoft.net 中的版本,您可以将其传递给编译器以从中读取元数据。它始终是 x86 版本,没有其他版本,所以不要费心寻找它。同样,这不是问题,编译器只使用引用程序集的元数据,它不执行任何代码。并且元数据不依赖于程序集的位数。

然而,如果您创建自己的混合模式程序集,这一切都可能成为问题。您很容易忽略提供两个版本的需要。所以编译器担心的是它看到您要求项目的 AnyCPU 或 x64 构建。但是检测到参考程序集只能在您以 x86 为目标时工作。所以它对你有点刺耳,只是一个温和的提醒,有一些证据表明你弄错了,当你运行它时,你的程序可能会在 BadImageFormatException 上崩溃。它不会以其他方式处理与您自己的参考程序集有任何不同的框架参考程序集。

所以,功能,而不是错误。只是一个不会阻止您的程序构建的警告。您可以放心地忽略该警告,因为您知道.NET 在运行时在 GAC 中具有正确的程序集。值得注意的是 .NET 4.0 没有这个问题,它使用非常不同的引用程序集,这些程序集没有关闭 ILONLY 元数据标志。

于 2012-12-07T19:04:14.603 回答
6

奇怪的行为。在项目属性中的构建下关闭“生成序列化程序集”会使项目在发布模式下构建得很好。查看此链接会发现此设置与 XML 序列化有关,我们甚至在整个解决方案中都没有使用它。

很奇怪。仍然在这里寻找这个问题和行为的解释。

于 2012-11-28T21:58:13.020 回答
2

查看您的构建配置是什么样的。有时会发生此错误,因为解决方案上的某些项目被配置为在一个构建配置中构建,而不是在另一个构建配置中。

去做这个:

  1. 转到“编译 > 配置管理...”
  2. 在“活动解决方案配置”上选择“发布”,这是给您带来问题的配置。
  3. 在“活动解决方案平台”上选中“任何 CPU”。如果定义了“x64”,您也可以选择它。
  4. 查看构建项目列表。解决方案所需的所有项目都必须在“配置”、“平台”中标记正确的值,并进行“编译”检查。

在我的情况下,我有一个沙堡项目,我在大多数情况下都取消选中,至少在调试模式下是这样,因为编译需要很长时间。有时会发生一个项目没有“发布”配置的配置,因此,当构建过程试图获得其结果时,这些不存在(没有 DLL)并且它抛出异常。在其他情况下,可能是一个项目被迫为 x86(或 x64)编译而其余的则不是,因此在尝试将其他引用项目链接到所引用 DLL 的正确版本时会引发错误。

于 2012-12-10T12:35:10.273 回答
1

您正在为哪个版本的 .NET 编译?如果您可以将项目更改为更高版本的 .NET 框架,那可能会有所帮助。

于 2012-12-06T20:03:02.787 回答
1

我的 VS2010 Web 项目也生成了这些警告,并且 IIS 抛出了 BadImageException。Build/Configuration/Platform 设置看起来没问题,但输出窗口显示 dll 是在 x64 文件夹中为任何 CPU 配置构建的。删除bin下的所有文件夹并重建。警告消失了,BadImageException 也消失了。

于 2014-04-23T05:28:17.647 回答