在简单的C共享对象文件上的C#中使用DllImport时,出现DllNotFoundException

时间:2019-05-06 12:55:43

标签: c# c mono dllimport

我正在尝试从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,表示可以在运行时在目录中找到文件。

1 个答案:

答案 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