.net 构建64位窗口操作系统时以x86 vs AnyCPU为目标

.net 构建64位窗口操作系统时以x86 vs AnyCPU为目标,.net,64-bit,.net,64 Bit,我有一个为.NET2.0编写的现有C#应用程序,目前的目标是AnyCPU。它目前引用了一些第三方.NET DLL,我没有这些DLL的源代码(我不确定它们是为x86、x64还是任何CPU构建的) 如果我想在64位Windows操作系统上运行我的应用程序,为了让我的应用程序运行无误,我应该针对哪个平台?我目前的理解是针对: x86:如果至少为x86构建了一个第三方.NET dll,或者使用p/Invoke与Win32 dll接口。应用程序将在32位和64位操作系统上以32位模式运行 x64:如果所

我有一个为.NET2.0编写的现有C#应用程序,目前的目标是AnyCPU。它目前引用了一些第三方.NET DLL,我没有这些DLL的源代码(我不确定它们是为x86、x64还是任何CPU构建的)

如果我想在64位Windows操作系统上运行我的应用程序,为了让我的应用程序运行无误,我应该针对哪个平台?我目前的理解是针对:

  • x86:如果至少为x86构建了一个第三方.NET dll,或者使用p/Invoke与Win32 dll接口。应用程序将在32位和64位操作系统上以32位模式运行
  • x64:如果所有第三方.NET DLL都已为x64或任何CPU构建。应用程序将仅在64位操作系统中运行
  • AnyCPU:如果已经为AnyCPU构建了所有第三方.NET DLL。应用程序将在32位操作系统上以32位模式运行,在64位操作系统上以64位模式运行
此外,我是否正确地认为,虽然在构建引用第三方x86.NET DLL的应用程序时,以任何CPU为目标不会产生错误,但当应用程序在64位操作系统上运行时,尝试加载这些DLL时,会引发运行时异常


因此,只要我的一个第三方DLL正在执行p/Invoke或是x86,我就只能将x86作为此应用程序的目标?

您可以从AnyCPU DLL执行p/Invoke,您只需要对p/Invoke定义更加小心一点(即,您不会无意中假定为32位或其他)。问题是,如果没有Reflector和反汇编,就很难知道第三方DLL是否做了正确的事情(当然,除非开发人员特别声明64位支持)

但除此之外,你还很在行


老实说,对于99%的应用程序,以x86为目标是完全可以接受的。实际上受益于64位的应用程序相对较少。(性能问题通常表现为一点小问题:x86模式和更大数据结构的寄存器重命名抵消了更多的寄存器,因为指针是两倍大[在像.NET这样的引用量更大的系统中更是如此])

对于您问题的这一特定部分,我很好奇

还有,我相信这一点是对的吗 以任何CPU为目标将不会生成 生成应用程序时出错 引用第三方x86.NET DLL, 应用程序将抛出一个运行时 尝试加载这些时发生异常 在64位操作系统上运行时的DLL

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

VisualStudio没有就引用或构建应用程序向我发出警告或投诉。当我运行应用程序(在64位操作系统上)并加载ClassLibrary1程序集时,我遇到了一个BadImageFormatException

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


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

AnyCPU是我的VS实例的默认目标平台,当您除了.NET framework之外没有其他依赖项时,这显然是正常的。一旦引入了其他依赖项,假设应用程序将继续在64位平台上工作,仅仅因为应用程序针对的是任何CPU,并且编译没有问题,这将是一个痛苦的假设。谢谢回答:)