假设我有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,如何实现这一目标?
答案 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)
您可以在以下博文中找到问题的答案
这是摘要
.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机器代码。