架构不匹配:x86 vs x64

时间:2015-03-20 06:57:19

标签: c# .net 64-bit .net-assembly

我有一个x64 .NET项目。对于那个项目,我添加了一个引用,我认为它是在AnyCPU模式下构建的。下图显示了该参考组件的CORFLAGS输出(32BITREQ:0 - > AnyCPU,对吧?)。

Output of CORFLAGS for my reference 编译器仍然给出了以下警告:

  

正在构建的项目“AMD64”的处理器架构与参考“MyReference,Version = 2.1.0.0,Culture = neutral”,“x86”的处理器架构之间存在不匹配。这种不匹配可能会导致运行时故障。请考虑通过Configuration Manager更改项目的目标处理器体系结构,以便在项目和引用之间调整处理器体系结构,或者使用与项目的目标处理器体系结构相匹配的处理器体系结构依赖于引用。

那么这里有什么问题?我是否错误地解释了CORFLAGS?或者我是否需要在VS构建配置中更改某些内容?

1 个答案:

答案 0 :(得分:2)

是的,你解释错了。最重要的信号是ILONLY : 0,它告诉您有一个包含IL和机器代码的混合模式程序集。 C ++ / CLI语言是创建类似程序集的主要方式,项目中的本机C ++代码直接编译为机器代码。

然后PE值告诉您此C ++代码已编译为x86机器代码。并且编译器会适当地警告此程序集在您的项目中不可用,当程序试图调用C ++代码时,它会在运行时使用BadImageFormatException进行炸弹。

32BITREQ位在这种情况下没有意义,只是“请求”它不够好,C ++链接器(无用)让它不被设置。

如果您想使用它,那么您将不得不重建它。将x64平台添加到项目中,以便C ++ / CLI编译器生成64位机器代码。这并不总是可能的,C ++ / CLI可能依赖于仅在32位可用的库或包含难以重写的汇编代码。如果大会不是你的,那么你将不得不通过电话询问。


无论如何,这有一丝希望,但请注意,这只是一个编译警告,而不是一个彻头彻尾的错误。您的计算机可能已在GAC中提供此程序集的64位版本,并由程序集所有者提供的安装程序提供。

看一下GAC的内容,c:\ windows \ microsoft.net \ assembly for .NET 4.0+程序集。 GAC_64子目录是包含64位机器代码的混合模式程序集的主目录。如果你在那里看到相同的程序集,那么你很高兴,CLR将在运行时从该目录加载程序集。只是一个小小的微光,这对于不属于.NET Framework的程序集来说并不常见。祝你好运。