通过将 MONO_LOG_LEVEL 设置为 debug 并将 MONO_LOG_MASK 过滤设置为仅与 DLL 相关的消息,您可以轻松地找到 mono 在哪里寻找该本地库。
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 和本机 dylib 的目录中
- MONO_LOG_LEVEL=调试 MONO_LOG_MASK=dll 单声道 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
假设您正在使用 Mono 的 OS-X 软件包安装程序,因此获得了 32 位版本的 Mono,因此需要 32 位版本的本机库。
>>file `which mono`
/usr/bin/mono: Mach-O executable i386
/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