Image.FromFile()或FromStream()挂起在GdiplusStartup上

时间:2014-11-12 18:40:44

标签: c# .net mono xamarin

我有一个包含这一行的简单C#应用程序:

var mImage = System.Drawing.Image.FromFile(filename);

在Windows(.NET)上运行此代码时,图像已正确加载。 在OS X(Mono)上运行相同的代码时,应用程序就会挂起。调试器永远保持在该调用中。没有例外也没有。

callstack显示应用程序挂起:

  

System.Drawing.GDIPlus.GdiplusStartup()

这里可能出现什么问题?

PS:我安装了最新版本的Xamarin Studio和Mono。

3 个答案:

答案 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

This StackOverFlow post may be useful as well