代码之家  ›  专栏  ›  技术社区  ›  anonymous

在构建64位窗口操作系统时,以x86和anycpu为目标

  •  10
  • anonymous  · 技术社区  · 14 年前

    我有一个为.NET 2.0和Targeting编写的现有C应用程序 任意CPU 目前。它当前引用了一些第三方.NET DLL,而我没有它们的源(我不确定它们是为x86、x64还是anycpu构建的)。

    如果我想专门在64位Windows操作系统上运行我的应用程序,我应该以哪个平台为目标,使我的应用程序运行时不会出错?我目前的理解是:

    • x86 :如果至少有一个第三方.NET dll是为x86生成的,或者使用p/invoke与win32 dll接口。应用程序将在32位和64位操作系统上以32位模式运行。
    • X64 :如果已经为x64或anycpu生成了所有第三方.NET DLL。应用程序只能在64位操作系统中运行。
    • 任意CPU :如果已经为任何CPU生成了所有第三方.NET DLL。应用程序将在32位操作系统上以32位模式运行,在64位操作系统上以64位模式运行。

    此外,我有理由相信,当以任何CPU为目标构建引用第三方x86.NET DLL的应用程序时,应用程序在64位操作系统上运行时尝试加载这些DLL时,会引发运行时异常。

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

    2 回复  |  直到 7 年前
        1
  •  7
  •   Dean Harding    14 年前

    您可以从anycpu dll执行p/invoke,只需要对p/invoke定义更加小心(即,您不会无意中假定为32位或其他类型)。问题是,很难知道第三方DLL是否在没有反射镜和分解它的情况下做了正确的事情(当然,除非开发人员特别声明64位支持)。

    但除此之外,你还很在行。

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

        2
  •  7
  •   Josh    14 年前

    我对你问题的这一具体部分很好奇。

    同时,我是否有权相信 以任何CPU为目标将不会生成 生成应用程序时出错 引用第三方x86.NET DLL, 应用程序将引发运行时 尝试加载这些时出现异常 当它在64位操作系统上运行时会被删除。

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

    Visual Studio没有对引用或生成应用程序发出警告或投诉。当我运行应用程序(在64位操作系统上)并加载ClassLibrary1程序集时,收到一个BadImageFormatException。

    如果我将consoleapplication1更改为target x64,则会收到编译器警告,但编译成功,运行时也会发生相同的异常。

    因此,为了回答您的问题,是的,如果您引用的程序集(或在运行时为此加载的任何程序集)也不是为任何CPU编译的,您很可能会遇到麻烦。如果你不确定,而且你不需要额外的地址空间,我会继续瞄准x86。如果您确定您的依赖项是为anycpu编译的,那么如果您愿意,您可以将anycpu作为目标,但一定要在两个处理器体系结构中进行大量测试。

    推荐文章