运行 可以用 Mono 编程但不能用 Visual Studio Mac

Can run program with Mono but not with Visual Studio Mac

所以我在 Visual Studio Mac 2019 年制作了一个 C# 程序。它使用依赖于动态库的 SFML.Net 框架:libcsfml-graphics.2.5.0.dylib .在内部,该框架有一个名为 sfRenderWindow_createUnicode(...) 的方法。此方法对 CSFML.graphics 使用 DLLImport。如果我 运行 Visual Studio 中的程序,我会得到 DllNotFoundException 消息 csfml-graphics.

在我的 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.

文件位于同一文件夹中

现在 运行ning 来自 Visual Studio 和 运行 mono 在终端中产生相同的结果。

万岁!

1) 确保您的 Platform Target 与您的 ABI 类型(x32 或 x64 位)匹配:

VS4M 将默认启动 32 位 Mono 版本,因为大多数项目目标默认为 x32。当然,如果您正在生产 "fat" 动态库,这并不重要。

2) 在 Run Configuration 中设置 DYLD_LIBRARY_PATH 以匹配您的 dylib 位置:

回复:https://www.mono-project.com/docs/advanced/pinvoke/#macos-framework-and-dylib-search-path