macossqlitemonosystem.data.sqlitedllnotfoundexception

Mono on Mac: DllNotFoundException despite SQLite.Interop.dll being in dllmap


I have a C# application that uses SQLite and works fine on Windows.

The same Visual Studio project compiles fine in Xamarin Studio, but when running I get:

DllNotFoundException: SQLite.Interop.dll

Despite:

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

I also tried adding <dllmap dll="SQLite.Interop.dll" target="libsqlite3.0.dylib" os="osx"/>, not better.

What is the problem?


Solution

  • You can easily find where mono is looking for that native library by setting the MONO_LOG_LEVEL to debug and MONO_LOG_MASK filtering to only DLL related messages.

    export MONO_LOG_LEVEL=debug
    export MONO_LOG_MASK=dll
    mono yourprogram.exe
    

    or as a one liner so you do not have to unset env vars:

    MONO_LOG_LEVEL=debug MONO_LOG_MASK=dll mono yourprogram.exe
    

    Mono and the OS-X dynamic link editor ('man dyld' for details) does not require DYLD_LIBRARY_PATH to be set to the current directory ('.'). Note: Linux does require LD_LIBRARY_PATH to include the current directory, if that is your intention.

    Using the native dll/shared library trace output you can track which library is not being found (or one of its dependancies) or if it is the wrong ARCH for your mono version.

    If you are still having problems, we would need to know which SQLite library you are using the options that you are using to compile it (or the arch version if getting it via a Nuget). A posting your dll trace output would quickly solve things also.

    Notes:

    I am assuming you are using the System.Data.SQLite library and are compiling the the options "/p:UseInteropDll=true /p:UseSqliteStandard=false".

    Mono includes a SQLite in it's default install, it is 32-bit on OS-X:

    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
    

    Assuming you are using the OS-X package installer from Mono, thus are getting the 32-bit version of Mono and thus need 32-bit versions of the native libraries.

    >>file `which mono`
    /usr/bin/mono: Mach-O executable i386
    

    The /usr/lib/libsqlite3.0.dylib is a multi ARCH fat binary, so that library is not a problem, but your debug output might show another one that is a problem,

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