macos - Mac 上的 Mono : DllNotFoundException despite SQLite. Interop.dll 在 dllmap 中

标签 macos sqlite mono system.data.sqlite dllnotfoundexception

我有一个使用 SQLite 并在 Windows 上运行良好的 C# 应用程序。

同一个 Visual Studio 项目在 Xamarin Studio 中编译良好,但在运行时我得到:

DllNotFoundException: SQLite.Interop.dll

尽管:

  • 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"/> ,不是更好。

问题是什么?

最佳答案

通过将 MONO_LOG_LEVEL 设置为 debug 并将 MONO_LOG_MASK 过滤设置为仅与 DLL 相关的消息,您可以轻松找到 mono 在哪里寻找 native 库。

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

或作为单行,这样您就不必取消设置环境变量:

MONO_LOG_LEVEL=debug MONO_LOG_MASK=dll mono yourprogram.exe

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

  • 将那些 dll 映射文件移开,将它们从等式中移除。
  • 取消设置 DYLD_LIBRARY_PATH
  • cd 进入包含基于 CIL 的 exe、dll 和 native dylib 的目录
  • MONO_LOG_LEVEL=debug MONO_LOG_MASK=dll mono yourprogram.exe

使用 native 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

假设您使用的是来自 Mono 的 OS-X 软件包安装程序,因此将获得 32 位版本的 Mono,因此需要 32 位版本的 native 库。

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

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

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

关于macos - Mac 上的 Mono : DllNotFoundException despite SQLite. Interop.dll 在 dllmap 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31152451/

相关文章:

android - 如何将 Joda instant 转换为 LocalDate,反之亦然?

c# - 如何获取应用程序中通过反射解析的每个程序集、命名空间和类的列表?

android - 您应该如何营销Android应用程序(免费还是付费)

c - mac os 套接字编程中的 gcc -lnsl 错误

excel - Excel for Mac 上的数组公式

java - 如何让一个简单的 Hello World Java 小程序在 Mac OS X 的浏览器中工作?

database - 如何合并多个 SQLite 数据库?

objective-c - 在全屏应用程序前添加 NSWindow

java - 安卓 : Error in getting URI of an image

c# - 单色触摸 : Doubling Appearance Image size when Hue adjusted on Retina display