Mono无法加载dll

Mono无法加载dll,mono,pinvoke,monodevelop,Mono,Pinvoke,Monodevelop,我试图通过p/Invoke加载并使用本机共享库。但是,它不会从欠开发状态加载。这是控制台输出,带有MONO\u LOG\u LEVEL=debug和MONO\u LOG\u MASK=dll: Creating a V8Engine instance ...Mono: DllImport attempting to load: 'V8_Net_Proxy'. Mono: DllImport error loading library '/localhome/rryk/v8netmonolinux

我试图通过p/Invoke加载并使用本机共享库。但是,它不会从欠开发状态加载。这是控制台输出,带有
MONO\u LOG\u LEVEL=debug
MONO\u LOG\u MASK=dll

Creating a V8Engine instance ...Mono: DllImport attempting to load: 'V8_Net_Proxy'.
Mono: DllImport error loading library '/localhome/rryk/v8netmonolinux/Source/bin/Debug/libV8_Net_Proxy': '/localhome/rryk/v8netmonolinux/Source/bin/Debug/libV8_Net_Proxy: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/localhome/rryk/v8netmonolinux/Source/bin/Debug/libV8_Net_Proxy.so': 'libv8-x64.so: cannot open shared object file: No such file or directory'.
但是,
libv8-x64.so
libv8\u Net\u代理位于同一目录中。so

/localhome/rryk/v8netmonolinux/Source/bin/Debug [mono-linux *]$ ls
libV8_Net_Proxy.so  V8.Net.Console.exe.config  V8.Net.dll.mdb                  V8.Net.Proxy.Interface.x64.dll      V8.Net.SharedTypes.dll.mdb  x64
libv8-x64.so        V8.Net.Console.exe.mdb     V8.Net.Proxy.Interface.dll      V8.Net.Proxy.Interface.x64.dll.mdb  V8.Net.SharedTypes.XML      x86
V8.Net.Console.exe  V8.Net.dll                 V8.Net.Proxy.Interface.dll.mdb  V8.Net.SharedTypes.dll              V8.Net.XML
更有趣的是,当从控制台执行时,相同的应用程序可以很好地加载库:

/localhome/rryk/v8netmonolinux/Source/bin/Debug [mono-linux *]$ MONO_LOG_LEVEL=debug MONO_LOG_MASK=dll mono V8.Net.Console.exe

Creating a V8Engine instance ...Mono: DllImport attempting to load: 'V8_Net_Proxy'.
Mono: DllImport error loading library '/localhome/rryk/v8netmonolinux/Source/bin/Debug/libV8_Net_Proxy': '/localhome/rryk/v8netmonolinux/Source/bin/Debug/libV8_Net_Proxy: cannot open shared object file: No such file or directory'.
Mono: DllImport loaded library '/localhome/rryk/v8netmonolinux/Source/bin/Debug/libV8_Net_Proxy.so'.
我还检查了控制台和MonoDevelop中是否使用了相同的mono二进制文件。事实上,我无法检查MonoDevelop使用的是哪个二进制文件,但设置中的.NET运行时部分显示的是版本3.0.12。在有此版本的系统中,我只有一个单声道二进制文件,默认情况下它是在命令行上使用的(如
whichis
中首先列出的):

是什么导致了这种差异?为什么Mono找不到位于同一目录中的libv8-x64.so

LD_LIBRARY_PATH=`pwd` mono V8.Net.Console.exe

我假设libv8-x64.so是libv8_Net_Proxy.so的依赖项,因此本机链接器可能会造成问题。请尝试将libv8-x64.so复制到/usr/lib,然后以root用户身份执行
ldconfig
,然后重试好吗?谢谢jariq,复制
libv8-x64.so
/usr/lib
确实可以解决问题,因为默认情况下
/usr/lib
位于
LD\u LIBRARY\u路径中,与其将所有私有库复制到
/usr/lib
,不如按照knocte的建议将私有库的路径添加到
LD_LIBRARY_path
。我只是想知道复制到/usr/lib是否有帮助,然后我打算提出更好的解决方案,例如使用LD_LIBRARY_path:(没关系,下次我会更快:)啊…我发现它太不直观了,默认情况下当前目录不属于LD_LIBRARY_路径。我实际上已经将它添加到了我的
.bashrc
中的
LD_LIBRARY_路径中,但这只适用于终端,这就是为什么它在那里工作,而不是在MonoDevelop中。你是对的,我实际上认为这是一个bug(使用LD_LIBRARY_PATH是一种解决方法),因此请继续并将其归档到Linux中,这是一个bug,而不是Xamarin:-)。MonoDevelop不控制本机库依赖项的解析方式。对此不确定,mono运行时默认应在托管程序集所在的同一文件夹中搜索(顺便说一句,我们这里说的不是Xamarin,我们说的是Mono;Xamarin是一家公司)它确实搜索托管库所在的同一目录,并找到本机库
libV8\u Net\u代理。因此
。但是,这个库依赖于另一个本机库
libV8-x64。因此
这个依赖关系是由Linux解决的,而不是Mono。
LD_LIBRARY_PATH=`pwd` mono V8.Net.Console.exe