在构建64位窗口操作系统时,针对x86与AnyCPU

时间:2010-06-01 04:24:17

标签: .net 64-bit

我现在有一个为.NET 2.0编写的C#应用​​程序,目标是 AnyCPU 。它目前引用了一些我没有源代码的第三方.NET DLL(我不确定它们是否是为x86,x64或AnyCPU构建的)。

如果我想在64位Windows操作系统上专门运行我的应用程序,我应该定位哪个平台才能使我的应用程序正常运行?我目前的理解是目标:

  • x86 :如果为x86构建了至少一个第三方.NET dll,或者使用p / Invoke与Win32 DLL进行交互。应用程序将在32位和64位操作系统上以32位模式运行。
  • x64 :如果已为x64或AnyCPU构建了所有第三方.NET dll。应用程序只能在64位操作系统中运行。
  • AnyCPU :如果已为AnyCPU构建了所有第三方.NET dll。应用程序将在32位操作系统上以32位模式运行,在64位操作系统上以64位运行。

另外,我是否相信,在构建引用第三方x86 .NET DLL的应用程序时,定位AnyCPU时不会产生任何错误,当应用程序在64位运行时尝试加载这些DLL时,它将引发运行时异常。位OS。

因此,只要我的第三方DLL之一正在进行p / Invoke或者是x86,我只能针对此应用程序定位x86吗?

2 个答案:

答案 0 :(得分:7)

你可以从AnyCPU DLL进行P / Invoke,你只需要更加小心P / Invoke定义(即你不会无意中假设32位或其他东西)。问题是很难知道第三方DLL是否在没有Reflector的情况下做正确的事情并将其拆解(除非开发人员特别声明64位支持)。

但除此之外,你几乎都是现场的。

老实说,对于99%的应用程序,目标x86是完全可以接受的。实际受益于64位的应用程序数量相对较少。 (性能问题通常只是一个问题:更多的寄存器被x86模式的寄存器重命名和更大的数据结构所抵消,因为指针是两倍大[并且在像.NET这样的参考重系统中甚至更糟])

答案 1 :(得分:7)

我对你问题的这个特定部分感到好奇。

  

另外,我是否有理由相信   目标AnyCPU将生成否   构建应用程序时出错   引用第三方x86 .NET DLL,   应用程序将抛出运行时   尝试加载这些时的异常   DLL在64位操作系统上运行时。

所以我试了一下。我创建了一个针对x86的DLL项目ClassLibrary1,然后添加了一个针对AnyCPU的ConsoleApplication1并引用了另一个项目。我确保在Main方法中实际使用ClassLibrary1项目中的类。

Visual Studio没有给我任何关于引用或构建应用程序的警告或投诉。当我运行应用程序(在64位操作系统上)并且加载了ClassLibrary1程序集时,我遇到了BadImageFormatException。

如果我将ConsoleApplication1更改为目标x64,我会收到编译器警告但编译成功并且在运行时发生相同的异常。

所以回答你的问题,是的,如果你的引用程序集(或者在运行时加载的任何程序集)也没有为AnyCPU编译,你很可能会遇到麻烦。如果您不确定,并且您不需要额外的地址空间,我会坚持使用x86。如果您确定您的依赖项是针对AnyCPU编译的,那么您可以根据需要定位AnyCPU,但一定要在两种处理器架构中进行大量测试。