我正在使用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位版本? (根据我在网上发现的信息,我怀疑是后者,但我有希望!)
答案 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>