繁体   English   中英

架构不匹配:x86与x64

[英]Architecture mismatch: x86 vs x64

我有一个x64 .NET项目。 在该项目中,我添加了一个参考,我相信该参考是在AnyCPU模式下构建的。 下图显示了该引用程序集的CORFLAGS的输出(32BITREQ:0-> AnyCPU,对吗?)。

CORFLAGS的输出供我参考 编译器仍然给我以下警告:

正在构建的项目“ AMD64”的处理器体系结构与参考文献“ MyReference,Version = 2.1.0.0,Culture = neutral”,“ x86”的处理器体系结构之间不匹配。 这种不匹配可能会导致运行时失败。 请考虑通过Configuration Manager更改项目的目标处理器体系结构,以使项目和引用之间的处理器体系结构保持一致,或者依赖于具有与项目目标处理器体系结构相匹配的处理器体系结构的引用。

那这怎么了? 我是否以错误的方式解释了CORFLAGS? 还是我需要在VS构建配置中更改某些内容?

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

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

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

如果要使用它,则必须对其进行重建。 将x64平台添加到项目中,以便C ++ / CLI编译器将生成64位机器代码。 这并非总是可能的,C ++ / CLI可能依赖于仅以32位提供的库,或者包含难以重写的汇编代码。 如果组装件不是您自己的,则必须打电话询问。


无论如何,总会有一点希望,请注意,这只是编译警告,而不是完全错误。 您的计算机可能已经在GAC中拥有此程序集的64位版本,该程序集由程序集所有者提供的安装程序放置在此处。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM