[Mono-bugs] [Bug 432408] New: [WIN32] Can't p/invoke dlls which link into cygwin*.dll

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Sun Oct 5 12:55:21 EDT 2008


           Summary: [WIN32] Can't p/invoke dlls which link into cygwin*.dll
           Product: Mono: Runtime
           Version: SVN
          Platform: PC
        OS/Version: Windows XP
            Status: NEW
          Severity: Major
          Priority: P5 - None
         Component: misc
        AssignedTo: lupus at novell.com
        ReportedBy: robertj at gmx.net
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---

I always wondered why I can't use Mono's WinForms on my systems at all. It was
simply hanging during the last *years* until I started to debug the problem.

It turned out that the following method is hanging:

System.Drawing.Graphics.FromHwnd (IntPtr)

A small test case revealed that, if fact, the *compilation* of
Graphics.FromHwnd was never terminating:

using System;
using System.Drawing;

class Program
        static void Main ()
                Graphics.FromHwnd (IntPtr.Zero);

mono -v -v -v test.exe is hanging after it outputs:

class System.Drawing.GDIPlus needs init call for UseX11Drawable
class System.Drawing.GDIPlus needs init call for Display

So I had a closer look at System.Drawing.Graphics.FromHwnd's OS switch code:


When I comment out the whole "if (GDIPlus.UseX11Drawable)" conditional,
WinForms starts working as expected. Uh huh. So it seems to be related to the
X11 p/invoke. But I'm on Windows, so they should not matter, no?

It turned out I actually have libX11.dll on my systems, as a part of cygwin's
X11 server!

A quick test revealed that no decent non-cygwin app is able to LoadLibrary a
cygwin-dependent dll:


 * compile with: "gcc -o cygshared.dll cygshared.c -shared"

int test ()
        return 42;


 * compile with: "cl usecyglib.c"

#include <windows.h>

int main (void)
        LoadLibrary ("cygshared.dll");
        printf ("done\n");

using System;
using System.Runtime.InteropServices;

class Program
        static extern int test ();

        static void Main ()
                Console.WriteLine (42 == test ());

IIRC, cygwin.dll is messing with SEH exception handling which breaks a lot of
apps including Mono and MS.NET.

A quick fix for the issue could be as simple as this:

Index: data/config.in
--- data/config.in      (revision 113696)
+++ data/config.in      (working copy)
@@ -15,7 +15,7 @@
        <dllmap dll="i:msvcrt.dll" target="@LIBC@" os="!windows"/>
        <dllmap dll="sqlite" target="@SQLITE@" os="!windows"/>
        <dllmap dll="sqlite3" target="@SQLITE3@" os="!windows"/>
-       <dllmap dll="libX11" target="@X11@" os="!windows" />
+       <dllmap dll="libX11" target="@X11@"/>
        <dllmap dll="libcairo-2.dll" target="libcairo.so.2" os="!windows"/>

We simply map libX11.dll to the on Windows non existing libX11.so as well.

Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.

More information about the mono-bugs mailing list