我一直在使用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)
(...)
我尝试添加&#34; libgdiplus.0.dylib&#34;从我的单声道安装到包含的osx文件夹(单声道动态库也位于其中)和可执行文件夹。除了更改错误消息中的文件名外,创建dllmap也不会执行任何操作。
我正在使用sgen变体,因此在x64中运行不是问题(有关此问题的讨论,另请参阅here。)
答案 0 :(得分:2)
此错误表示mono无法找到您尝试使用其中一个类所需的库。
为了保持与.NET Framework的兼容性,mono使用与windows相同的库名。这些名称使用DllMaps映射到linux库名称。
(用“dylib”代替“.so”代表MacOS X)
如果尚未在应用程序或程序集.config文件的DllMap条目中显式指定库位置,Mono将在以下几个位置搜索库:
从中加载引用图像的目录。 在任何地方,系统的动态加载程序都配置为查找共享库。例如,在Linux上,这在$ LD_LIBRARY_PATH环境变量和/etc/ld.so.conf文件中指定。在Windows上,使用$ PATH环境变量。 解决问题的下一步是在系统上找到该文件。
$ find / usr -name libgdiplus.so /usr/local/lib/libgdiplus.so 啊哈!它就是。那么为什么单声道找不到呢?
默认情况下,在linux的所有发行版中,动态链接器只为/ lib和/ usr / lib中的文件创建一个缓存。由于您已将库放在/ usr / local / lib中,因此它不知道它。您可以使用以下命令对此进行验证:
ldconfig -p | grep libgdiplus 该命令不应产生输出,因为它不知道该文件。
解决此问题的正确方法是将/ usr / local / lib添加为ldconfig索引的路径之一。为此,请将路径添加到/etc/ld.so.conf并以root身份运行“ldconfig”,这将强制重建缓存。
动态链接器现在应该知道此路径中的所有库。您可以通过再次输入以上命令来验证这一点:
$ ldconfig -p | grep libgdiplus libgdiplus.so(libc6)=&gt; /usr/local/lib/libgdiplus.so 好极了!您的应用程序现在应该正常运行。
注意:如上所述,您还可以将$ LD_LIBRARY_PATH环境变量设置为包含库的路径,但这不是推荐的,因为它可能会导致其他问题并且更难以维护。
有关详细信息,请查看http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/