我试图使用win32单编译器在Linux主机上构建一个本地mcs应用程序。
我有一个库(CoolLib.dll),它有以下行
[global::System.Runtime.InteropServices.DllImport("MyLib.dll", EntryPoint="...")]它是使用mcs编译的,因此具有以下格式
$ file CoolLib.dll
PE32+ executable (DLL) (console) x86-64 Mono/.Net assembly, for MS Windows现在,MyLib.dll也是我的,我用mingw-g++在同一台主机上编译。
$ file MyLib.dll
MyLib.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows然后我编译了我的hello可执行文件,引用了CoolLib.dll..。
mcs /reference:CoolLib.dll /out:main.exe /target:x64 main.cs
MONO_LOG_LEVEL=debug mono main.exe...but它和System.DllNotFoundException一起爆炸了。
然而,我不明白的是为什么它抱怨MyLib.dll 不是ELF
Mono: DllImport error loading library '/bindings_test/MyLib.dll': '/bindings_test/MyLib.dll: invalid ELF header'.毕竟,它应该是一个win32库。为什么mono希望它是一个ELF?
发布于 2022-06-24 19:46:43
从评论中抄来的。
你需要记住的一些事实是,
微软决定为托管位重用相同的文件扩展名和文件格式,所以像你这样的人在迁移到另一个操作系统之前不会很容易地注意到大的变化。
因此,要回答您的问题,如果您在Linux上有一些C/C++依赖项,那么必须使用本机C/C++编译器以ELF格式重新编译它们。然后,您的.NET核心/Mono应用程序可以使用PInvoke来使用它们。您不能以PE32格式使用这些本机依赖项,因为Linux不会识别这是什么。
发布于 2022-06-22 07:29:34
用mcs生成的库是为目标Intel 80386生成的,而用mingw-g++构建的库是为目标x86-64生成的。
你不能混音平台。为32位或64位Windows构建所有内容。
例如,使用32位版本的MinGW-w64,或者使用-m32标志,如果您的MinGW-w64版本支持这两个目标。
https://stackoverflow.com/questions/72708990
复制相似问题