System.DllNotFoundException - 如何导入SO文件?

时间:2017-05-10 15:26:15

标签: c# linux mono

我正在使用Monodevelop并拥有一个C#主程序,它调用用C编写的共享对象文件。解决方案构建成功,但是当我尝试运行它时,我得到上面的System.DllNotfoundException和一个致命的未处理异常都指向到同一个共享对象文件。

我看过以下内容: - Calling UNIX and Linux shared object file .so from c# http://mono.1490590.n4.nabble.com/Adding-libraries-to-monodevelop-td1500573.html http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/ http://www.mono-project.com/docs/advanced/pinvoke/

并按此处设置SO文件的路径: - https://www.cyberciti.biz/faq/linux-setting-changing-library-path/

ldconfig -v的输出显示正确的文件夹,但不显示.SO文件。其中一个链接表明,SO文件的名称并不重要,但如果它是相关的,我的不会以' lib'

开头。

此应用程序之前已经有效,但是由于公司买断我接管了它并且我不熟悉Monodevelop,或者确实是Linux平台上的C#。

项目构建正常,但无法运行,因为无法找到SO文件。

我还将SO文件包含在Monodevelop的解决方案中,并将其设置为Build Action选项中的EmbeddedResource。不确定这是否必要或正确。

C#代码调用: -

[DllImport("xxxxxx.so")]
protected static extern Int32 xxxxxx_init();

并且还有一些调用都涉及同一个SO文件。

任何帮助都一如既往地感激不尽:) Ĵ

6月12日更新: 所以,我查看了日志文件,并提出了大量问题。无法找到.SO文件,因此我已将LDCONFIG更新到相关目录。

这有帮助,但仅在查找.SO文件时 - 它仍然无法加载,因为原始的.SO文件被创建为32位,而我的Monodevelop版本是64位。

有没有办法在Monodevelop中编译c#代码以形成32位可执行文件,或者我是否必须将共享对象文件重新编译为64位版本? (根据我在网上发现的信息,我怀疑是后者,但我有希望!)

1 个答案:

答案 0 :(得分:0)

免责声明:我对Mono没有经验(就像我一样)。

您可能想尝试检查.so本身是否存在某些依赖项。

来自here(我已经看到你提到了这个链接,但你没有说任何关于日志级别或检查依赖关系):

  

原生依赖项和P / Invoke

     

通过P / Invoke使用本机库时,您可能会看到类似的错误   无法找到库时请注意,当一个本机库   加载本机库可能会尝试加载其他库   这也取决于它。任何失败似乎都会导致   DllNotFoundException只表示原始本机   未找到正在加载的库。因此,人们最终可能得到一个   在库就位时出现DllNotFoundException。

     

可以在设置调试日志级别时解决此问题:

$ MONO_LOG_LEVEL=debug mono YourApp.exe
<snip>
Mono-INFO: DllImport error loading library: 'Interop.so': '/usr/lib/Interop.so: undefined symbol: __some_function
<snip>