diff --git a/ChangeLog b/ChangeLog index 343c586ae..e7fffd45e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-08-25 Mike Kestner + + * generator/Signal.cs : use typeof instead of Type.GetType to + specify the event args type. + * glib/ObjectManager.cs : beef up the type lookup code using + Assembly.LoadWithPartialName to fix a very popular win32 bug. + [Fixes #61139 and friends] Thanks to John Luke for expert + patch testing on win32. + 2004-08-25 John Luke * glib/MainLoop.cs: MainLoop implementation by Jeroen diff --git a/generator/Signal.cs b/generator/Signal.cs index c445fb4bc..4beff6420 100644 --- a/generator/Signal.cs +++ b/generator/Signal.cs @@ -268,20 +268,14 @@ namespace GtkSharp.Generation { sw.WriteLine("\t\t\t\tif (value.Method.GetCustomAttributes(typeof(GLib.ConnectBeforeAttribute), false).Length > 0) {"); sw.WriteLine("\t\t\t\t\tif (BeforeHandlers[" + cname + "] == null)"); sw.Write("\t\t\t\t\t\tBeforeSignals[" + cname + "] = new " + qual_marsh); - sw.Write("(this, " + cname + ", value, System.Type.GetType(\"" + EventArgsQualifiedName); - if (EventArgsQualifiedName != "System.EventArgs") - sw.Write("," + gen_info.AssemblyName); - sw.WriteLine("\"), 0);"); + sw.Write("(this, " + cname + ", value, typeof (" + EventArgsQualifiedName + "), 0);"); sw.WriteLine("\t\t\t\t\telse"); sw.WriteLine("\t\t\t\t\t\t((GLib.SignalCallback) BeforeSignals [{0}]).AddDelegate (value);", cname); sw.WriteLine("\t\t\t\t\tBeforeHandlers.AddHandler(" + cname + ", value);"); sw.WriteLine("\t\t\t\t} else {"); sw.WriteLine("\t\t\t\t\tif (AfterHandlers[" + cname + "] == null)"); sw.Write("\t\t\t\t\t\tAfterSignals[" + cname + "] = new " + qual_marsh); - sw.Write("(this, " + cname + ", value, System.Type.GetType(\"" + EventArgsQualifiedName); - if (EventArgsQualifiedName != "System.EventArgs") - sw.Write("," + gen_info.AssemblyName); - sw.WriteLine("\"), 1);"); + sw.Write("(this, " + cname + ", value, typeof (" + EventArgsQualifiedName + "), 1);"); sw.WriteLine("\t\t\t\t\telse"); sw.WriteLine("\t\t\t\t\t\t((GLib.SignalCallback) AfterSignals [{0}]).AddDelegate (value);", cname); sw.WriteLine("\t\t\t\t\tAfterHandlers.AddHandler(" + cname + ", value);"); diff --git a/glib/ObjectManager.cs b/glib/ObjectManager.cs index 6ae7bed18..728deda9a 100644 --- a/glib/ObjectManager.cs +++ b/glib/ObjectManager.cs @@ -46,7 +46,7 @@ namespace GLib { mangled = (string)types[typename]; else mangled = GetExpected (typename); - Type t = Type.GetType (mangled); + Type t = LookupType (mangled); // if null, try to get a parent type if (t == null) @@ -116,6 +116,20 @@ namespace GLib { [DllImport("glibsharpglue")] static extern IntPtr gtksharp_get_type_name_for_id (int typ); + static Type LookupType (string mangled) + { + string[] toks = mangled.Split (','); + if (toks.Length < 2) + throw new ArgumentException ("mangled not properly formatted: " + mangled); + + Assembly a = Assembly.LoadWithPartialName (toks [1]); + + if (a == null) + return null; + + return a.GetType (toks [0]); + } + static Type GetValidParentType (IntPtr raw) { int type_id = gtksharp_get_type_id (raw); @@ -130,7 +144,7 @@ namespace GLib { mangled = (string)types[typename]; else mangled = GetExpected (typename); - t = Type.GetType (mangled); + t = LookupType (mangled); if (t != null) { return t; }