【问题标题】:Compiling a C# .NET x64 binary on an x86 system在 x86 系统上编译 C# .NET x64 二进制文件
【发布时间】:2012-02-16 19:11:26
【问题描述】:

我有一个 C# 项目,其中包含对 ScintillaNET 的引用。不幸的是,ScintillaNET 喜欢检测机器的体系结构并根据运行的体系结构加载本机 DLL。这意味着我的项目必须预编译成x86和x64版本(由于上述检测,我不能使用Any CPU)。

问题是我的构建服务器仅支持 x86。有没有办法可以在 x86 机器上以 x64 模式编译 .NET 程序集?据我所知,切换只是强制计算机为所需架构加载程序集,并且在编译时实际上并不输出任何与架构相关的代码,但是,当在构建服务器上的 Mono 2.10.6 下编译时,我得到错误,例如:

“错误 CS0016:无法写入文件 `ScintillaNet',原因:AMD64”

我不能使用 CorFlags.exe 来更改 PE 标头,因为这是基于 Linux 的构建服务器。有没有办法做到这一点?

【问题讨论】:

  • 毫无意义,位数由主启动程序集(EXE)决定,而不是由像 ScintillaNET 这样的库决定。使用 AnyCPU。
  • 听起来他的项目是主要的启动程序集。如果它在 x64 的机器上以 x86 启动,则 Scintilla 将进行自己的检测,找到 x64,尝试将本机 x64 dll 加载到 x86 应用程序中并失败。确实,这是 Scintilla 中的一个错误,它没有检测到当前进程的体系结构,而不是机器。
  • 根据 mono 文档,--aot 选项不将平台作为参数。目前看来是不可能的。

标签: c# .net mono cross-compiling


【解决方案1】:

我最终通过将项目切换回任何 CPU 来解决此问题。由于无论 .NET 设置如何,Scintilla 都只能在本机架构中工作,因此我必须在我的机器上以 64 位运行它。最初我打算将架构强制为 32 位以获取 Edit and Continue,这会导致混淆 Scintilla 如何检测架构。

实际上,Scintilla 会强制自己使用本机架构,但如果您在任何 CPU 下构建和运行,.NET 应用程序将可以正常工作。此外,由于我无法在 32 位模式下运行带有 Scintilla 的 .NET 应用程序(用于编辑并继续工作),因此在我的机器上强制使用 64 位模式也没有任何优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多