使用X86和Any CPU的C#项目

wuh*_*uha 5 .net c# visual-studio

假设我有2个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."
Run Code Online (Sandbox Code Playgroud)

但是,我发现如果我在.NET 4.5上定位项目B,那么这个问题就不会发生了.但是我仍然希望B项目定位到4.0,如何实现这一目标?

Ben*_*igt 8

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

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

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

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


May*_*ank 7

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

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 机器码。

• 如果该进程在 Itanium Windows 系统上运行(有没有人使用过?;-) ),它将作为 64 位进程运行。IL 被编译为 Itanium 机器代码。

.net 4.5

在 .NET 4.5 和 Visual Studio 11 中,奶酪已被移动。大多数 .NET 项目的默认值仍然是 AnyCPU,但现在 AnyCPU 的含义不止一种。AnyCPU 有一个额外的子类型,“Any CPU 32-bit preferred”,这是新的默认值(总的来说,/platform C# 编译器开关现在有五个选项:x86、Itanium、x64、anycpu 和 anycpu32bitpreferred )。使用 AnyCPU 的那种风格时,语义如下:

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

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

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