我有一个包含这一行的简单C#应用程序:
var mImage = System.Drawing.Image.FromFile(filename);
在Windows(.NET)上运行此代码时,图像已正确加载。 在OS X(Mono)上运行相同的代码时,应用程序就会挂起。调试器永远保持在该调用中。没有例外也没有。
callstack显示应用程序挂起:
System.Drawing.GDIPlus.GdiplusStartup()
这里可能出现什么问题?
PS:我安装了最新版本的Xamarin Studio和Mono。
答案 0 :(得分:5)
1)不仅检查您是否拥有最新的Xamarin Studio版本,而且检查您是否拥有最新版本!
错误报告:
Troy Dawson在一个多月前使用 Xamarin Studio版本5.5(build 198)报告了此问题:https://bugzilla.xamarin.com/show_bug.cgi?id=23444
"使用alpha发布频道中的最新Mono,附加项目 在以下位置运行时应该引发一个类型未发现的异常:
var image = Image.FromStream(content);
因为GDIPlus无法初始化或其他什么。
这类似于我在Image.FromStream()中提到的另一个错误 Mono首次运行时需要很长时间才能返回。"
完全例外:
类型初始化程序抛出异常 System.Drawing.GDIPlus ---> System.Exception:GdiplusStartup
<强>解决方案:强>
在2014-09-29报告错误后的第二天,Sadik Ali确认他可以重现问题Comment 1,然后4天后,Troy Dawson确认 Xamarin Studio版本5.5(版本227)修复问题 Comment 2。
<小时/> 2)如果它仍然以最新版本失败,我建议您通过限制并确保支持您重新加载的图像: https://github.com/mono/libgdiplus/blob/master/TODO
答案 1 :(得分:3)
问题在于MonoMac GDI与Mac字体接口的方式。第一次启动时,它会构建一个所需的字体缓存,这实际上需要几分钟分钟。让它运行一段时间。一旦构建了字体缓存,这种延迟就会消失。
如果你杀了它,它永远不会完成构建缓存,并且它每次都会发生。很遗憾他们甚至还没有打印任何形式的对话或消息,这种情况正在发生。
在极少数情况下,单声道可能无法写入font-cache目录。在这种情况下,您可以以root用户身份运行应用,也可以按照instructions here。
进行操作答案 2 :(得分:0)
问题可能是表现。你的代码运行正常;图像只需要更长的时间来加载,这是因为mono System.Drawing
只是一个C#包装器
可悲的是,mono的System.Drawing在System.Drawing
中提供了所有功能的主要问题。 Windows运行良好,因为它使用本机GDIPlus.dll,但您的代码在基于unix的系统中可能无法正常工作。
See more info about mono's System.Drawing here
根据您的使用方式,System.Drawing有更好的替代方案。
MonoMac建议Mono.Cairo