运行 可以用 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
所以我在 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