[Mono-list] Instantiating an object via AppDomain.CreateInstance

Lluis Sanchez lluis@ximian.com
Thu, 17 Jun 2004 20:46:42 +0200


Anyway, it is now fixed in CVS.

On dj, 2004-06-17 at 18:49, Lluis Sanchez wrote:
> Looks like a bug. Can you please file a bug report in
> bugzilla.ximian.com?
> 
> Thanks!
> Lluis.
> 
> On dj, 2004-06-17 at 17:55, Yuri Leikind wrote:
> > Hello all,
> > 
> > 
> > If I instantiate an object via AppDomain.CreateInstance , and this object's
> > class has a constructor with parameters, I get the exception
> > 
> > 	Unhandled Exception: System.MissingMethodException: Constructor not found.
> > 
> > though needed parameters are passed to AppDomain.CreateInstance
> > 
> > I found it out trying an example from Programming C#, 2nd edition. This example
> > runs on MS .NET and fails on Mono.
> > 
> > Here is it :
> > 
> > ====================================
> > using System;
> > using System.Runtime.Remoting;
> > using System.Reflection;
> > namespace ProgCSharp
> > {
> >    // for marshal by reference comment out
> >    // the attribute and uncomment the base class
> >    [Serializable]
> >    public class Point // : MarshalByRefObject
> >    {
> >       public Point (int x, int y)
> >       {
> >          Console.WriteLine( "[{0}] {1}",
> >             System.AppDomain.CurrentDomain.FriendlyName,
> >             "Point constructor");
> >          this.x = x;
> >          this.y = y;
> >       }
> >       public int X
> >       {
> >          get
> >          {
> >             Console.WriteLine( "[{0}] {1}",
> >                System.AppDomain.CurrentDomain.FriendlyName,
> >                "Point x.get");
> >             return this.x;
> >          }
> >          set
> >          {
> >             Console.WriteLine( "[{0}] {1}",
> >                System.AppDomain.CurrentDomain.FriendlyName,
> >                "Point x.set");
> >             this.x = value;
> >          }
> >       }
> >       public int Y
> >       {
> >          get
> >          {
> >             Console.WriteLine( "[{0}] {1}",
> >                System.AppDomain.CurrentDomain.FriendlyName,
> >                "Point y.get");
> >             return this.y;
> >          }
> >          set
> >          {
> >             Console.WriteLine( "[{0}] {1}",
> >                System.AppDomain.CurrentDomain.FriendlyName,
> >                "Point y.set");
> >             this.y = value;
> >          }
> >       }
> > 
> > 
> >    private int x;
> >    private int y;
> > }
> > // the shape class marshals by reference
> > public class Shape : MarshalByRefObject
> > {
> >    public Shape(int upperLeftX, int upperLeftY)
> >    {
> >       Console.WriteLine( "[{0}] {1}",
> >          System.AppDomain.CurrentDomain.FriendlyName,
> >          "Shape constructor");
> >       upperLeft = new Point(upperLeftX, upperLeftY);
> >    }
> >    public Point GetUpperLeft( )
> >    {
> >       return upperLeft;
> >    }
> >    public void ShowUpperLeft( )
> >    {
> >       Console.WriteLine( "[{0}] Upper left: {1},{2}",
> >          System.AppDomain.CurrentDomain.FriendlyName,
> >          upperLeft.X, upperLeft.Y);
> >    }
> >    private Point upperLeft;
> > }
> > public class Tester
> > {
> >    public static void Main( )
> >    {
> >       Console.WriteLine( "[{0}] {1}",
> >          System.AppDomain.CurrentDomain.FriendlyName,
> >          "Entered Main");
> >       // create the new app domain
> >       AppDomain ad2 =
> >          AppDomain.CreateDomain("Shape Domain");
> >       // Assembly a = Assembly.LoadFrom("ProgCSharp.exe");
> >       // Object theShape = a.CreateInstance("Shape");
> >       // instantiate a Shape object
> >       ObjectHandle oh = ad2.CreateInstance(
> >          "ProgCSharp",
> >          "ProgCSharp.Shape", false,
> >          System.Reflection.BindingFlags.CreateInstance,
> >          null, new object[] {3, 5},
> >          null, null, null );
> >       Shape s1 = (Shape) oh.Unwrap( );
> >       s1.ShowUpperLeft( );     // ask the object to display
> >       // get a local copy? proxy?
> >       Point localPoint = s1.GetUpperLeft( );
> >         // assign new values
> >         localPoint.X = 500;
> >         localPoint.Y = 600;
> >         // display the value of the local Point object
> >         Console.WriteLine( "[{0}] localPoint: {1}, {2}",
> >            System.AppDomain.CurrentDomain.FriendlyName,
> >            localPoint.X, localPoint.Y);
> >         s1.ShowUpperLeft( );     // show the value once more
> >       }
> >    }
> > }
> > 
> > ====================================
> > 
> > Here is the output:
> > 
> > leikind@pc324:~$ mono ProgCSharp.exe 
> > [ProgCSharp.exe] Entered Main
> > 
> > Unhandled Exception: System.MissingMethodException: Constructor not found.
> > 
> > Server stack trace: 
> > in <0x0019a> System.Activator:CreateInstance (System.Type,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo,object[])
> > in <0x00074> System.Activator:CreateInstance (string,string,bool,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo,object[],System.Security.Policy.Evidence)
> > in <0x00055> System.AppDomain:CreateInstance (string,string,bool,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo,object[],System.Security.Policy.Evidence)
> > in (unmanaged) (wrapper managed-to-native) System.Runtime.Remoting.RemotingServices:InternalExecute (System.Reflection.MonoMethod,object,object[],object[]&)
> > in <0x00004> (wrapper managed-to-native) System.Runtime.Remoting.RemotingServices:InternalExecute (System.Reflection.MonoMethod,object,object[],object[]&)
> > in <0x00172> System.Runtime.Remoting.RemotingServices:InternalExecuteMessage (System.MarshalByRefObject,System.Runtime.Remoting.Messaging.IMethodCallMessage)
> > 
> > 
> > Exception rethrown at [0]: 
> > 
> > in <0x00748> System.Runtime.Remoting.Proxies.RealProxy:PrivateInvoke (System.Runtime.Remoting.Proxies.RealProxy,System.Runtime.Remoting.Messaging.IMessage,System.Exception&,object[]&)
> > 
> > =======================================
> > 
> > Does anyone have a clue to this incompatibility?  
> 
> _______________________________________________
> Mono-list maillist  -  Mono-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list