同时使用X86和Any CPU的C#项目

本文关键字:CPU 项目 Any X86 | 更新日期: 2023-09-27 18:28:12

假设我有两个Winform项目A、B。

项目A(目标.NET 2.0)必须在x86上运行(它是一个外部库),并且由于遗留原因,项目B(目标.NET 4.0)必须在任何CPU上运行。现在我需要从项目B调用A的方法,但它抛出了一个错误:

"An unhandled exception of type 'System.BadImageFormatException' occurred in System.Windows.Forms.dll"
Additional information: Could not load file or assembly 'CSharpDemo, Version=1.0.5414.18636, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format."

然而,我发现如果我的目标是.NET 4.5上的项目B,那么这个问题就不会发生。但我仍然希望项目B的目标是4.0,如何实现这一点?

同时使用X86和Any CPU的C#项目

如果您的任何代码调用32位x86库,则整个过程需要加载为x86。没有例外。

要执行此操作,请将EXE项目设置为x86,将具有本机x86依赖项的DLL项目设置为x86,对于纯托管DLL项目,您可以使用AnyCPU--.NET将它们作为x86 EXE加载,但它们也可以加载到x64 EXE中。

请记住,在WOW64兼容层的帮助下,x86代码在运行x64 Windows的x64处理器上运行得很好。

(除了有限的例外:在Windows Server版本上,WOW64是一个可选组件,在预安装环境中没有WOW64)。

您可以在以下博客文章中找到问题的答案

http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/

以下是摘要

.net 4.0

AnyCPU在.NET 4.0(和Visual Studio 2010)之前的含义如下:

•如果进程在32位Windows系统上运行,则它将作为32位进程运行。IL被编译为x86机器代码。

•如果进程在64位Windows系统上运行,则它将作为64位进程运行。IL已编译为x64计算机代码。

•如果进程在安腾Windows系统上运行(有人有吗?;-)),它将作为64位进程运行。IL被编译为安腾机器代码。

.net 4.5

在.NET 4.5和Visual Studio 11中,奶酪已经被移走了。这个大多数.NET项目的默认值也是AnyCPU,但有一个现在对任何CPU都有意义。还有一个子类型的AnyCPU,"任何CPU 32位首选",这是新的默认值(总体而言现在有五个选项用于/platform C#编译器开关:x86,Itanium、x64、anycpu和anycpu32bit首选)。使用时AnyCPU的风格,语义如下:

•如果过程在32位Windows系统上运行,它作为32位进程运行。IL是编译为x86机器代码。

•如果进程在64位Windows上运行系统,它作为一个32位进程运行。IL编译为x86机器密码

•如果进程在ARM Windows系统上运行,它将作为32位进程。IL被编译成ARM机器代码。