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

ano*_*ous 10 .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:如果所有第三方.NET dll都已为AnyCPU构建.应用程序将在32位操作系统上以32位模式运行,在64位操作系统上以64位运行.

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

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

Dea*_*ing 7

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

但除此之外,你几乎都是正确的.

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


Jos*_*osh 7

我很好奇你的问题的这个特定部分.

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

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

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

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

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