I've encountered an issue in some software that calls System.Drawing.Image (), passing in a filename that is not portable which I've raised as bug #14002.

System.Drawing.Image () verifies the file's existence with File.Exists (which uses the Mono.IO portability framework), then passes the filename to GDIPlus.GdipLoadImageFromFile () which does not use the portability framework and fails to open the file.

To fix this, I either need to make GdipLoadImageFromFile use the same portability mechanism as has been built into Mono.IO, or System.Drawing.Image () needs to convert the filename it receives (if necessary) before passing it to GdipLoadImageFromFile ().

As I see it, the disadvantage of fixing GDIPlus is that as a separate library to Mono, it may require code duplication which might lead to divergent code bugs in the future. On the other hand, if its common practice for user software (and not just the class libraries) to call GDIPlus.GdipLoadImageFromFile, then it absolutely has to be fixed in the GDIPlus library - converting the filename within System.Drawing.Image would only solve a subset of the issue.

If user software never calls GDIPlus.GdipLoadImageFromFile directly, then it could be quite safe to fix it in System.Drawing.Image, which would mean that we don't have to duplicate code between mono and GDIPlus.

A 3rd option that would avoid duplicating code between GDIPlus and Mono.IO could be to have some kind of managed code wrapper to GdipLoadImageFromFile that calls a function in Mono.IO to find the correct filename, before passing the converted filename onwards. That would leave the portability code in one place, but still allow GDIPlus to take advantage of it.

Any thoughts about which route I should go down?

Regards,
Frankie Fisher
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to