Mac上的Mono:DllNotFoundException,尽管SQLite.Interop.dll在dllmap中

Nic*_*oul 5 sqlite macos mono dllnotfoundexception system.data.sqlite

我有一个使用SQLite的C#应用​​程序,可以在Windows上正常运行.

相同的Visual Studio项目在Xamarin Studio中编译得很好,但在运行时我得到:

DllNotFoundException: SQLite.Interop.dll
Run Code Online (Sandbox Code Playgroud)

尽管:

  • libsqlite3.0.dylib/usr/lib,也以相同的文件夹作为可执行文件和其他DLL
  • . 是的一部分 $DYLD_LIBRARY_PATH
  • 可执行文件和所有使用SQLite的DLL都有一个匹配的<the_exe_or_dll_including_filename_extension>.config文件,其中包含:

<configuration> <dllmap dll="sqlite" target="libsqlite.0.dylib" os="osx"/> <dllmap dll="sqlite3" target="libsqlite3.0.dylib" os="osx"/> </configuration>

我也尝试过添加<dllmap dll="SQLite.Interop.dll" target="libsqlite3.0.dylib" os="osx"/>,而不是更好.

问题是什么?

Sus*_*ver 5

通过将MONO_LOG_LEVEL设置为debug并将MONO_LOG_MASK过滤设置为仅与DLL相关的消息,您可以轻松找到mono查找本机库的位置.

export MONO_LOG_LEVEL=debug
export MONO_LOG_MASK=dll
mono yourprogram.exe
Run Code Online (Sandbox Code Playgroud)

或作为一个班轮,所以你不必取消env vars:

MONO_LOG_LEVEL=debug MONO_LOG_MASK=dll mono yourprogram.exe
Run Code Online (Sandbox Code Playgroud)

Mono和OS-X动态链接编辑器(详见'man dyld')不需要将DYLD_LIBRARY_PATH设置为当前目录('.').注意:Linux确实需要LD_LIBRARY_PATH来包含当前目录(如果这是您的意图).

  • 将这些dll贴图文件移开,将其从等式中移除.
  • 取消设置DYLD_LIBRARY_PATH
  • cd在包含基于CIL的exe,dll和本机dylib的目录中
  • MONO_LOG_LEVEL =调试MONO_LOG_MASK = dll mono yourprogram.exe

使用本机dll /共享库跟踪输出,您可以跟踪找不到哪个库(或其中一个依赖项),或者您的单声道版本是否为错误的ARCH.

如果您仍然遇到问题,我们需要知道您正在使用哪个SQLite库来编译它(或者如果通过Nuget获取它,则使用arch版本).发布你的dll跟踪输出也可以快速解决问题.

笔记:

我假设您正在使用System.Data.SQLite库并正在编译选项"/ p:UseInteropDll = true/p:UseSqliteStandard = false".

Mono在其默认安装中包含一个SQLite,它在OS-X上是32位:

file /Library/Frameworks/Mono.framework/Versions/4.0.2/lib/libsqlite3.dylib
/Library/Frameworks/Mono.framework/Versions/4.0.2/lib/libsqlite3.dylib: Mach-O dynamically linked shared library i386
Run Code Online (Sandbox Code Playgroud)

假设您正在使用Mono的OS-X软件包安装程序,因此获得了32位版本的Mono,因此需要32位版本的本机库.

>>file `which mono`
/usr/bin/mono: Mach-O executable i386
Run Code Online (Sandbox Code Playgroud)

/usr/lib/libsqlite3.0.dylib是一个多ARCH胖二进制文件,因此库不是问题,但是您的调试输出可能会显示另一个问题,

>>file /usr/lib/libsqlite3.0.dylib
libsqlite3.0.dylib: Mach-O universal binary with 3 architectures
libsqlite3.0.dylib (for architecture x86_64):   Mach-O 64-bit dynamically linked shared library x86_64
libsqlite3.0.dylib (for architecture i386): Mach-O dynamically linked shared library i386
libsqlite3.0.dylib (for architecture x86_64h):  Mach-O 64-bit dynamically linked shared library x86_64
Run Code Online (Sandbox Code Playgroud)