[Gtk-sharp-list] Need help solving a problem using glade-lib/gtk/etc... app on Windows .Net.

Anset anset@anset.org
Wed, 25 Aug 2004 14:56:58 +0200


Sorry if this email is a bit long, but I wanted to be complete...

I have written a small program to test gtk-sharp compatibility between linux
(gentoo) and windows (xp). On the windows side I did not install mono. I
want to test compatibility between linux/mono and windows/.net.

To get gtk functionality on the windows pc, I installed the "Gtk# Win32
Installer for Microsoft .NET Framework 1.1 SDK", which I found at

I used glade-2 to create a gui XML file. The gui is very simple: a text
label and a few buttons.

On linux I used monodevelop to compile the program, embedding the xml file
as a resource. Everything works the way it should. No problems.

Now I copy the exe file over to my windows box and try to run it.

I get an unhandled exception. (see below)

I then compile the program using csc on the windows box. Compilation goes
without a problem, but when I run the program, I get the same unhandled
exception (see below).

I copied the exe I compiled on the windows box with csc over to my linux pc
and there it runs perfectly.

Here is the stack trace I get on the windows box. Again, the stack trace is
identical for both the mcs and csc compiled exe's:

Unhandled Exception: System.ArgumentNullException: Key cannot be null.
Parameter name: key
   at System.Collections.Hashtable.ContainsKey(Object key)
   at GLib.ObjectManager.GetValidParentType(IntPtr raw)
   at GLib.ObjectManager.CreateObject(IntPtr raw)
   at GLib.Object.GetObject(IntPtr o, Boolean owned_ref)
   at GLib.Object.GetObject(IntPtr o)
   at Glade.XML.GetWidget(String name)
   at Glade.XML.BindFields(Object target, Type type)
   at Glade.XML.Autoconnect(Object handler)
   at gtk_hello_world..ctor(String[] args)
   at gtk_hello_world.Main(String[] args)

I have done some digging and came to the following procedure in the
gtk-sharp/glib/ObjectManager.cs file
(from cvs.hispalinux.es):

static Type GetValidParentType (IntPtr raw)
   int type_id = gtksharp_get_type_id (raw);
   string typename;
   string mangled;
   Type t;
   // We will always end up at GObject and will break this loop
   while (true) {
         type_id = gtksharp_get_parent_type (type_id);
         typename = Marshal.PtrToStringAnsi (gtksharp_get_type_name_for_id
         if (types.ContainsKey (typename))
            mangled = (string)types[typename];
            mangled = GetExpected (typename);
         t = Type.GetType (mangled);
         if (t != null) {
            return t;

The first "if" statement makes the call to ContainsKey which (as far as I
was able to deduce) causes the unhandled exception.

Now the argument that is "null" is "typename". This variable gets its value
with the call just above that line:

typename = Marshal.PtrToStringAnsi (gtksharp_get_type_name_for_id

I was not able to find details about the gtksharp_get_type_name_for_id
function. (or more precisely the g_type_name function that is called by it).

What puzzles me here is that Marshal.PtrToStringAnsi apparantly returns
"null"... Reading the description in the documentation,
Marshal.PtrToStringAnsi will trow an exception if its argument is null, so
whatever gtksharp_get_type_name_for_id (type_id) is returning, it is not
"null". From what I have found on the net, Marshal.PtrToStringAnsi should
not return "null"...

So what happened inside Marshal.PtrToStringAnsi?
And only on the windows .net platform?

This is where I am stuck.

I cannot imagine that gtk-sharp on windows is this broken. So I must be
doing something wrong.
But I'm unable to figure this out...

If anyone can help, I would greatly appreciate it.

All the files I used can be found at http://anset.org/gtk-problem
I put a readme file with info on what file does what (just in case).

Best regards and thank you for your time,