在OSX上使用MonoKickstart时找不到gdiplus.dll

Tom*_*Tom 6 c# macos mono system.drawing opentk

我一直在使用MonoKickstart来获得在OSX上运行的项目 - 它是基于OpenTK构建的.我让程序完全正常工作,但是一旦我删除了我的Mono.framework(好吧,实际上已重命名),弹出以下错误:

[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for System.Drawing.GDIPlus ---> System.DllNotFoundException: gdiplus.dll
  at (wrapper managed-to-native) System.Drawing.GDIPlus:GdiplusStartup (ulong&,System.Drawing.GdiplusStartupInput&,System.Drawing.GdiplusStartupOutput&)
  at System.Drawing.GDIPlus..cctor () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Drawing.Bitmap..ctor (System.String filename, Boolean useIcm) [0x00000] in <filename unknown>:0 
  at System.Drawing.Bitmap..ctor (System.String filename) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Drawing.Bitmap:.ctor (string)
 (...)
Run Code Online (Sandbox Code Playgroud)

我尝试将单声道安装中的"libgdiplus.0.dylib"添加到包含的osx文件夹(单声道动态库也位于其中)和可执行文件夹中.除了更改错误消息中的文件名外,创建dllmap也不会执行任何操作.

我正在使用sgen变体,因此在x64中运行不是问题(另请参阅此处讨论此问题).

Ste*_*rka 2

此错误意味着 mono 无法找到您尝试使用的类之一所需的库。

\n\n

为了保持与 .NET Framework 的兼容性,mono 使用与 windows 相同的库名称。这些名称使用 DllMaps 映射到 Linux 库名称。

\n\n

\n(对于 MacOS X,将 \xe2\x80\x9c.so\xe2\x80\x9d 替换为 \xe2\x80\x9cdylib\xe2\x80\x9d)

\n\n

如果应用程序或程序集 .config 文件的 DllMap 条目中未显式指定库位置,Mono 将在几个位置搜索库:

\n\n

加载引用图像的目录。\n在任何位置,系统\xe2\x80\x99s 动态加载器都配置为查找共享库。例如,在 Linux 上,这是在 $LD_LIBRARY_PATH 环境变量和 /etc/ld.so.conf 文件中指定的。在 Windows 上,则使用 $PATH 环境变量。\n解决问题的下一步是在系统上找到该文件。

\n\n

$ find /usr -name libgdiplus.so\n/usr/local/lib/libgdiplus.so\n啊哈!就在那里。那么为什么\xe2\x80\x99t mono能找到呢?

\n\n

默认情况下,基本上所有 Linux 发行版中的动态链接器只为 /lib 和 /usr/lib 中的文件创建缓存。由于您已将库放置在 /usr/local/lib 中,因此它不知道这一点。您可以使用以下命令验证这一点:

\n\n

ldconfig -p |grep libgdiplus\n该命令不应产生任何输出,因为它不知道该文件。

\n\n

解决此问题的正确方法是将 /usr/local/lib 添加为 ldconfig 索引的路径之一。为此,请将路径添加到 /etc/ld.so.conf 并以 root 身份运行 \xe2\x80\x9cldconfig\xe2\x80\x9d,这将强制重建缓存。

\n\n

动态链接器现在应该知道该路径中的所有库。您可以通过再次输入上述命令来验证这一点:

\n\n

$ ldconfig -p |grep libgdiplus\n libgdiplus.so (libc6) => /usr/local/lib/libgdiplus.so\n耶!您的应用程序现在应该可以正常运行。

\n\n

注意:如上所述,您还可以将 $LD_LIBRARY_PATH 环境变量设置为包含库的路径,但不建议这样做,因为它可能会导致其他问题并且更难以维护。

\n\n

欲了解更多信息,请查看http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/

\n