【问题标题】:VS2012 compiles to x86 with "Any CPU" in a x64 OSVS2012 在 x64 操作系统中使用“任何 CPU”编译到 x86
【发布时间】:2014-04-03 08:15:10
【问题描述】:

我有一个包含 C# 项目和 C DLL 的解决方案。解决方案设置为“混合平台”,C# 项目设置为“任何 CPU”。

当 DLL 设置为针对 x64 编译时,我遇到了崩溃。但是当 DLL 设置为针对 x86 编译时,一切正常。

操作系统是 Windows7 x64。

无论我尝试哪个,Environment.Is64BitProcess 都会给出 false。

我的理解是“任何 CPU”默认情况下会编译为 x64,因为操作系统是 x64。很明显,我错了。

谢谢你们。

【问题讨论】:

  • 这是 Visual Studio 中的可用性噩梦,VS2010 真的搞砸了。解决方案的平台名称与 C# 项目无关,它只与 C++ 项目有关。您只关心一个设置,右键单击您的 EXE 项目,属性,构建选项卡,平台目标/首选 32 位。为调试和发布配置设置它。您希望 x86 让 C 代码保持愉快。
  • 是的,设置了“首选 32 位”标志。在对这些选项进行了一些处理之后,我让它适用于 x64 和 Any CPU。谢谢。

标签: c# visual-studio-2012 dll compilation


【解决方案1】:

我的理解是“Any CPU”默认会编译成 x64

不,它会编译为“任何 CPU”。它的运行方式取决于执行它的机器。因此,如果您在 64 位 CPU 上运行它,那么是的,它将以 64 位运行。但是,从崩溃来看,听起来您的 C dll 是 32 位的,或者您正在使用 32 位 API 调用。在这种情况下,您需要将其编译为 32 位。请注意,在 VS2013 中,“任何 CPU”还有一个“首选 32 位”选项,除非 32 位根本不可用,否则它将以 32 位运行。大多数人都想关闭它关闭 ;p

还要注意,如果这是一个 (来自 dll 标记),它还取决于 进程 是 32 位还是 64 位。

【讨论】:

    【解决方案2】:

    首先我们现在应该知道Platform target是什么:

    anycpu(默认)编译您的程序集以在任何平台上运行。您的应用程序尽可能以 64 位进程运行,并在只有该模式可用时回退到 32 位。

    anycpu32bitpreferred 编译您的程序集以在任何平台上运行。您的应用程序在支持 64 位和 32 位应用程序的系统上以 32 位模式运行。您只能为面向 .NET Framework 4.5 的项目指定此选项。

    ARM 编译您的程序集以在具有高级 RISC 机器 (ARM) 处理器的计算机上运行。

    x64 将您的程序集编译为由支持 AMD64 或 EM64T 指令集的计算机上的 64 位公共语言运行时运行。

    x86 将您的程序集编译为由 32 位、x86 兼容的公共语言运行时运行。 Itanium 将您的程序集编译为由具有Itanium 处理器的计算机上的 64 位公共语言运行时运行。

    所以anyCpu 表示运行 32 位和 64 位取决于您的 cpu。我认为您的 dll 是 32 位,所以您可以使用 x86anycpu

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2012-08-02
      • 2012-02-16
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多