[Mono-list] AppDomain

Torstensson, Patrik patrik.torstensson@intel.com
Mon, 24 Feb 2003 15:11:51 -0800

Hi Danel,

I'm a bit late into the thread but I will try to give you some hints of
how to fix this;

  klass = ((MonoTransparentProxy *)sampleApplicationHost)->klass;

The TP->klass points to the real class object and we don't change that
vtable when creating a proxy (the proxies is local to a domain and the
klass objects are static and not domain specific). This means that the

  mono_runtime_invoke (klass->vtable[i], sampleApplicationHost, NULL,

Just calling the method on the global class object pointing to the local
implementation instead of calling the remoting wrapper that calls
managed world and remoting (and is then changed into the other domain
and called..)

The easy fix for this is to call the vtable on the object directly
instead (it contains compiled remote wrappers):

  mono_runtime_invoke (sampleApplicationHost->vtable[i],
sampleApplicationHost, NULL, NULL);

This should (I haven't tested it) call the correct remoting function,
the vtable slot (should) will be the same as for the class.

 Patrik Torstensson

> -----Original Message-----
> From: Daniel Lopez [mailto:daniel@rawbyte.com] 
> Sent: Monday, February 24, 2003 7:02 PM
> To: mono-list@ximian.com
> Subject: [Mono-list] AppDomain
> Hi,
> I am looking for the correct way to call a method in a 
> transparent proxy
> from the C side of mono. When I create an object in a 
> different AppDomain
> and call it from C# everything is fine, but when I do it from 
> C, it gets
> executed in the same domain.
> I attach some sample code to demonstrate what I mean.
> In c# the result of compiling and running test.exe:
> mcs test.cs /r:System.Web
> mono test.exe
> Main AppDomain: test.exe
> Process request AppDomain: 56ca2e66
> And compiling and running test.c
> mcs test.cs /r:System.Web /target:library
> cp test.dll /usr/lib  (or somewhere where it will be picked 
> up from the path)
> gcc -o test test.c pkg-config --cflags --libs mono -lm
> ./test
> Main Domain: testing
> Process request AppDomain: testing
> So what is the correct way of invoking the method so it will 
> be executed in
> the other domain? I tried every method I could think of with no luck.
> Best regards
> DAniel