Visual Studio 2012添加了对错误DLL的引用

时间:2012-11-28 21:36:05

标签: c# visual-studio visual-studio-2012

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

我尝试过的事情:

  • 调试模式,任何CPU构建都很好。

  • 调试模式,x64构建正常。

  • 发布模式,任何CPU出现故障

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

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

我删除了C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll

中的System.Data引用

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

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

5 个答案:

答案 0 :(得分: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元数据标志的非常不同的引用程序集。

答案 1 :(得分:6)

奇怪的行为。在Build in project属性中关闭“生成序列化程序集”可以使项目在发布模式下正常构建。查看this link表明此设置与XML序列化有关,我们甚至不在整个解决方案中使用它。

非常奇怪。仍在寻找这个问题和行为的解释。

答案 2 :(得分:2)

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

要做到这一点:

  1. 转到“编译>配置管理...”
  2. 在“Active solutions configuration”中选择“Release”,这是给您带来问题的配置。
  3. 在“活动解决方案平台”上,选中“任何CPU”。如果定义了“x64”,您也可以选择它。
  4. 查看构建项目列表。解决方案所需的所有项目必须在“配置”,“平台”中标记正确的值,并进行“编译”检查。
  5. 在我的情况下,我有一个沙堡项目,我大部分时间都没有检查,至少在调试模式下,因为编译需要很长时间。有时会发生一个项目没有“Release”配置的配置,因此,当构建过程尝试获取其结果时,这些不存在(没有DLL)并且它会抛出异常。在其他情况下,可能是项目被强制编译为x86(或x64)而其余项不是,因此在尝试将其他引用项目链接到引用的DLL的正确版本时会引发错误。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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