[Mono-list] Instantiating an object via
AppDomain.CreateInstance
Lluis Sanchez
lluis@ximian.com
Thu, 17 Jun 2004 18:49:37 +0200
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?