[Mono-winforms-list] "System.NotImplementedException: Bitmap.InitFromStream (win32)"

Ricardo Stuven Ricardo Stuven <rstuven@gmail.com>
Tue, 26 Apr 2005 12:03:22 -0400


I'm trying Mono 1.1.6 in Windows XP. This simple line:
...raises the following exception:

        Unhandled Exception: System.TypeInitializationException: An excepti=
was thrown
         by the type initializer for MessageBoxForm --->
        ionException: Exception has been thrown by the target of an
invocation. ---> Sys
        tem.NotImplementedException: Bitmap.InitFromStream (win32)

        in <0x00103> System.Drawing.Image:InitFromStream
(System.IO.Stream stream)
        in <0x0052b> System.Resources.ResourceReader:ResourceValue (Int32 i=
        in <0x00010> System.Resources.ResourceManager:GetObject
(System.String name)
        in <0x00017> System.Windows.Forms.Locale:GetResource
(System.String name)
        in <0x00012>
System.Windows.Forms.MessageBox+MessageBoxForm:.cctor ()--- End of
        inner exception stack trace ---
        in <0x00000> <unknown method>
        in <0x0002c> System.Windows.Forms.MessageBox:Show (System.String te=

I digged a bit into the source code of Mono and found the following clues:

*)  System.Drawing\Image.cs has an explanation:

        // this is MS-land
        // FIXME
        // We can't call the native gdip functions here, because they expec=
        // a COM IStream interface.  So, a hack is to create a tmp file, re=
        // the stream, and then load from the tmp file.
        // This is an ugly hack.
        throw new NotImplementedException ("Bitmap.InitFromStream (win32)")=

*) MessageBoxForm tries to get reources in this way:
internal static Image   info_icon       =3D

*) There is a System.Runtime.InteropServices.ComTypes\IStream.cs
implemented only "if NET_2_0".

I have two questions:

1) Is it feasible to resolve this issue using the above-mentioned
IStream, declaring something like:

        internal static extern Status GdipLoadImageFromStream ( IStream
stream, out IntPtr image );

...in System.Drawing.gdipFunctions.cs, and then using it in
Image:InitFromStream "MS-land" ?

2) Is it really necessary that MessageBox tried to load an image
resource when the call was just ".Show(text)" ? Maybe it's better to
load the resources in the "switch (icon)" part...

Hoping my comments be useful.
Ricardo Stuven.