.net - 为 64 位窗口操作系统构建时针对 x86 与 AnyCPU

标签 .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 :如果所有第三方 .NET dll 已经为 x64 或 AnyCPU 构建。应用程序只能在 64 位操作系统中运行。
  • AnyCPU :如果所有第三方 .NET dll 已经为 AnyCPU 构建。应用程序将在 32 位操作系统上以 32 位模式运行,在 64 位操作系统上以 64 位模式运行。

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

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

    最佳答案

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

    但除此之外,你几乎是准确的。

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

    关于.net - 为 64 位窗口操作系统构建时针对 x86 与 AnyCPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947264/

    相关文章:

    .net - 如何使用 Json.NET 为数组中的每个对象反序列化带有 "root"元素的 JSON 数组?

    c++ - 如何创建 x64 版本的 native 控制台项目?

    assembly - 将 64 位常量移动到 x86 程序集中的内存中

    c# - 将数组插入 MongoDB 的子集合中会省略 _t 鉴别器

    .net - 将 HTML 插入 OpenXML Word 文档 (.Net)

    .net - 如何在 .NET 中序列化此 Xml(数组)

    c# - 嵌套 if ... else 流的更简单/更有效的方法?

    vb6 - 如何将 ActiveX 网格控件 (VB6) 重新编译为 64 位 OCX?

    msbuild - 在MSBuild中找出当前操作系统的 "Bit"

    64-bit - x64 和 IA-64 有什么区别?