架构不匹配:x86 与 x64

Architecture mismatch: x86 vs x64

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

编译器仍然给我以下警告:

There was a mismatch between the processor architecture of the project being built "AMD64" and the processor architecture of the reference "MyReference, Version=2.1.0.0, Culture=neutral", "x86". This mismatch may cause runtime failures. Please consider changing the targeted processor architecture of your project through the Configuration Manager so as to align the processor architectures between your project and references, or take a dependency on references with a processor architecture that matches the targeted processor architecture of your project.

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

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

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

32BITREQ 位在这种情况下没有意义,只是 "requesting" 不够好,C++ 链接器(毫无帮助)未设置它。

如果要使用它,则必须重建它。将 x64 平台添加到项目中,以便 C++/CLI 编译器生成 64 位机器代码。这并不总是可能的,C++/CLI 可能依赖于仅在 32 位中可用的库或包含难以重写的汇编代码。如果集会不是你的,那么你必须上 phone 去问。


有一线希望,不管怎样,结果都很好,请注意,这只是一个编译 警告,而不是一个彻底的错误。您的机器 可能 已经在 GAC 中提供了该程序集的 64 位版本,由程序集所有者提供的安装程序放置在那里。

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