我无法让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
我浏览并添加C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Data.dll
,但是当我单击该System.Data引用时,路径仍然清除到旧的dll并导致发生相同的错误。这也发生在其他几个DLL上。
有没有人知道这个问题的解决方案?
答案 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)
查看构建配置的外观。有时会发生此错误,因为解决方案上的某个项目配置为在一个构建配置中构建,而不是在另一个构建配置中构建。
要做到这一点:
在我的情况下,我有一个沙堡项目,我大部分时间都没有检查,至少在调试模式下,因为编译需要很长时间。有时会发生一个项目没有“Release”配置的配置,因此,当构建过程尝试获取其结果时,这些不存在(没有DLL)并且它会抛出异常。在其他情况下,可能是项目被强制编译为x86(或x64)而其余项不是,因此在尝试将其他引用项目链接到引用的DLL的正确版本时会引发错误。
答案 3 :(得分:1)
您要编译哪个版本的.NET?如果您可以将项目更改为更高版本的.NET框架,那可能会有所帮助。
答案 4 :(得分:1)
我的VS2010 Web项目也生成了这些警告,并且IIS正在抛出BadImageException。 Build / Configuration / Platform设置看起来没问题,但是Output窗口显示dll是在x64文件夹中为任何CPU配置构建的。删除bin下的所有文件夹并重建。警告消失了,BadImageException也没了。