【问题标题】:Can run program with Mono but not with Visual Studio Mac可以使用 Mono 运行程序,但不能使用 Visual Studio Mac
【发布时间】: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-graphicsDllNotFoundException

在我的 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 -Llibcsfml-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 中运行它在添加 &lt;dllmap&gt; 之后。为了清楚起见,我编辑了我的帖子,谢谢!

标签: c# mono sfml visual-studio-mac


【解决方案1】:

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

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

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

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

【讨论】:

  • 所以现在 DLL 位于 bin/Debug 中,当我使用该文件夹的绝对路径时,一切正常。有没有办法更一般地说明查看可执行文件夹?我还尝试使用 DYLD_LIBRARY_PATH 将 DLL 复制到 /usr/local/lib,但它不起作用。它不会抛出异常,它只是似乎冻结并且什么都不做。
  • @rcplusplus 我认为是${TargetPath} 但不记得VS4M是否对env进行了扩展。瓦尔斯。在为该运行会话设置它们之前(它适用于 post/pre 命令等)
  • 好吧,有些奇怪的事情发生了。我从列表中删除了环境变量,但一切仍然有效....dylib 文件位于bin/Debug/usr/local/lib 中。不知道为什么现在一切都神奇地起作用了??
  • 我和我谈过很快一切又坏了
  • 每日白痴奖应该颁给我,因为我忘了设置平台目标。所以我正式绕了一圈……
猜你喜欢
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 2017-05-09
相关资源
最近更新 更多