我正在尝试从C#运行C代码,但是即使文件存在,我也会收到DllNotFoundException。我有一个C文件“ test.c”,其中包含以下代码:
int test(int a) {
return a + 10;
}
我使用以下命令将其编译到共享库中:
gcc test.c -c -shared -fPIC -o libtest.so
此文件被添加到项目中,并且我将其设置设置为“始终复制”,因此它位于build指令中。 C#代码如下所示:
using System;
using System.Runtime.InteropServices;
namespace CTest {
class Program {
[DllImport("test")]
public static extern int test(int i);
public static void Main(string[] args) {
Console.WriteLine(test(1));
}
}
}
我正在具有Mono和框架目标版本v4.7.2的linux上运行它。我收到以下错误:
Unhandled Exception:
System.DllNotFoundException: test
at (wrapper managed-to-native) CWrapperTestFramework.Program.test(int)
at CWrapperTestFramework.Program.Main (System.String[] args) [0x00001] in <827de23517bb4c0eb7fed2eff92099aa>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: test
at (wrapper managed-to-native) CWrapperTestFramework.Program.test(int)
at CWrapperTestFramework.Program.Main (System.String[] args) [0x00001] in <827de23517bb4c0eb7fed2eff92099aa>:0
我也尝试过导入“ libtest.so”以及所有其他方式。使用File.Exists("libtest.so")
返回true,表示可以在运行时在目录中找到文件。
答案 0 :(得分:1)
我找到了解决方案。使用
运行可执行文件$ MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono CTest.exe
告诉我那个only ET_DYN and ET_EXEC can be loaded
。正在运行
readelf -h libtest.so
告诉我Type: REL (Relocatable file)
,应该是DYN (Shared Object File)
。尽管-shared
的编译选项可以做到这一点,但是显然我必须使用-flinker-output=dyn
指定它。所以必须这样编译
gcc test.c -o test.o -fPIC -c
gcc test.o -o libtest.so -flinker-output=dyn -shared