使用X86和Any CPU的C#项目

时间:2014-10-27 23:27:13

标签: c# .net 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."

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

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:4)

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

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还有一个子类型,   “任何32位首选的CPU”,这是新的默认值(总体而言,那里   现在是/ platform C#编译器开关的五个选项:x86,   Itanium,x64,anycpu和anycpu32bitpreferred)。使用时   AnyCPU的味道,语义如下:

     

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

     

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

     

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