在x86系统上编译C# .NET x64二进制文件

13

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

问题在于我的构建服务器仅支持x86。是否有办法在x86机器上以x64模式编译.NET程序集?据我所知,切换只是强制计算机加载所需体系结构的程序集,并不实际在编译时输出任何体系结构相关的代码。但是,在构建服务器上使用Mono 2.10.6进行编译时,我会遇到以下错误:

"error CS0016: Could not write to file `ScintillaNet', cause: AMD64"

由于这是一个基于Linux的构建服务器,我不能使用CorFlags.exe更改PE头文件。是否有任何方法可以解决这个问题?


5
主启动程序(EXE)决定了字长,而不是像ScintillaNET这样的库。请使用AnyCPU。这句话的意思是:字长是由主启动程序决定的,跟ScintillaNET这个库无关。建议使用AnyCPU。 - Hans Passant
4
听起来他的项目是主要的启动程序集。如果在x64机器上以x86形式启动,Scintilla将自己进行检测,找到x64并尝试将本地的x64 dlls加载到x86应用程序中并失败。实际上,这是Scintilla存在的一个错误,它没有检测当前进程的架构,而是检测了计算机的架构。 - antiduh
根据Mono文档,--aot选项不接受平台作为参数。目前似乎还不可能实现。 - Sedat Kapanoglu
1个回答

2
我最终解决了这个问题,方法是将项目切换回任意CPU。由于Scintilla无论.NET设置如何都只能在本地架构下工作,因此我必须在我的计算机上以64位运行它。最初,我打算强制使用32位架构来获取编辑和继续功能,这导致了Scintilla检测体系结构的混乱。
实际上,Scintilla将强制自身为本地体系结构,但如果您在任意CPU下构建和运行.NET应用程序,则.NET应用程序将正常工作。此外,由于我无法在32位模式下运行带有Scintilla的.NET应用程序(为使编辑和继续功能工作),因此在我的计算机上强制使用64位模式也没有任何优势。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接