【发布时间】:2019-12-26 05:20:52
【问题描述】:
所以我有一个在 Visual Studio Mac 2019 中制作的 C# 程序。它使用依赖于动态库的 SFML.Net 框架:libcsfml-graphics.2.5.0.dylib。在内部,框架有一个名为sfRenderWindow_createUnicode(...) 的方法。此方法将DLLImport 用于CSFML.graphics。如果我在 Visual Studio 中运行该程序,我会收到带有消息 csfml-graphics 的 DllNotFoundException。
在我的 Mono 全局 config 文件中,我有一个 DLL 映射:
<dllmap dll="csfml-graphics" target="libcsfml-graphics.2.5.0.dylib" />
添加之后,如果我在 Visual Studio 中运行我的程序,我仍然会得到一个 DllNotFoundException。 然而,消息现在显示libcsfml-graphics.2.5.0.dylib。所以它正在寻找合适的库但找不到它? .dylib 文件与.exe 位于同一文件夹中。
奇怪的是我可以像这样从终端运行程序:
MONO_LOG_LEVEL=debug MONO_LOG_MASK=dll mono hello-csharp.exe > log.txt
log.txt 文件包含以下几行:
Mono: DllImport attempting to load: 'libcsfml-graphics.2.5.0.dylib'.
Mono: DllImport loaded library '/Users/rutvik/Desktop/hello-csharp/hello-csharp/bin/Debug/libcsfml-graphics.2.5.0.dylib'.
Mono: DllImport searching in: 'libcsfml-graphics.2.5.0.dylib' ('/Users/rutvik/Desktop/hello-csharp/hello-csharp/bin/Debug/libcsfml-graphics.2.5.0.dylib').
Mono: Searching for 'sfRenderWindow_createUnicode'.
Mono: Probing 'sfRenderWindow_createUnicode'.
Mono: Found as 'sfRenderWindow_createUnicode'.
所以它可以出于某种原因找到.dylib。 Visual Studio Mac 有什么不同?以及如何配置它以使其工作?
供参考,这里是otool -L 与libcsfml-graphics.2.5.0.dylib 运行:
libcsfml-graphics.2.5.0.dylib:
libcsfml-graphics.2.5.dylib (compatibility version 2.5.0, current version 2.5.0)
@rpath/sfml-graphics.framework/Versions/2.5.1/sfml-graphics (compatibility version 2.5.0, current version 2.5.1)
@rpath/sfml-window.framework/Versions/2.5.1/sfml-window (compatibility version 2.5.0, current version 2.5.1)
@rpath/sfml-system.framework/Versions/2.5.1/sfml-system (compatibility version 2.5.0, current version 2.5.1)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
最终的结果:
总结一下,我把所有的.dylib文件放在/usr/local/lib里。诀窍是将平台目标设置为x64,如接受的答案中指定的那样。 DYLD_LIBRARY_PATH 环境实际上根本不需要。并且.dylib 文件不必与.exe 位于同一文件夹中。
现在从 Visual Studio 运行和在终端中使用 mono 运行都会产生相同的结果。
万岁!
【问题讨论】:
-
你说“如果我在 VisualStudio 中运行程序......”,然后是“现在,如果我在 VisualStudio 中运行程序......”;我想某处有错字
-
@knocte 我的意思是说如果我在 Visual Studio 中运行它在添加
<dllmap>之后。为了清楚起见,我编辑了我的帖子,谢谢!
标签: c# mono sfml visual-studio-mac