[Mono-dev] Creating AppDomains From Embedded Mono

Jim Purbrick jimpurbrick at yahoo.co.uk
Wed Jan 11 13:17:25 EST 2006

Hi Robert/Lupus/Everyone,

I've tried Robert's approach (which cleans my code up,
but is vulnerable to changes in _MonoAppDomain as
Paolo said), but I still get the same crash when
making the mono_runtime_invoke() call to

At this point I'm struggling with the limited
debugging I can do in VS 2003 when the code calls in
to glib or the mono. The error I get is Unhandled
exception at 0x10059acc in debugsim.exe: 0xC0000005:
Access violation reading location 0x00000007. And the
call stack is:

	debugsim.exe!createDomain(const char *
name=0x0302edf8)  Line 31 + 0x11	C++

Which doesn't tell me a lot. I wonder whether the
problem is something to do with my new Windows
configuration as the code worked fine with mono in my old Windows installation, but now I get
this problem with mono, and 1.1.13.
Could some differences in the environment be causing
the problem? The value of MONO_PATH or some other
environment variable? This is just wild speculation
really. Is there anything else I can do to diagnose
the problem?

At the moment I'm thinking the best thing to do might
be to #define the code to use a single AppDomain on
Windows and just do the secondary AppDomain creation
and unloading on Linux, which is our production
environment anyway. I'm loathe to make the 2 versions
behave differently, but it would allow me to make some
forward progress while trying to sort this problem out
as a background task.

Thanks for all your help on this.



--- Robert Jordan <robertj at gmx.net> wrote:

> Hi Jim,
> > Hi Robert/Everyone,
> > 
> > 
> >>You can and *should* invoke the managed
> >>AppDomain methods to load and unload domains. 
> >>You don't need an intermediate managed assembly 
> >>to do that (untested):
> >>
> >>MonoAppDomain*
> >>createDomain (char *name) ....
> >>
> >>void
> >>unloadDomain (MonoAppDomain *domain) ...
> > 
> > 
> > That gets me a MonoAppDomain*, which I can
> presumably
> > use to call AppDomain.Load(Byte[]) to load a
> script's
> > assembly, which will be unloaded (along with JIT
> > output etc.) when I call unloadDomain?
> MonoAppDomain is the unmanaged representation of
> System.AppDomain.
> You can call every System.AppDomain method using
> mono_runtime_invoke,
> like in my sample above.
> > How do I turn the MonoAppDomain in to a MonoDomain
> > required by mono_object_new, mono_string_new etc.?
> Indeed, there is no accessor defined for it, but you
> can
> define this struct somewhere after you include
> appdomain.h:
> struct _MonoAppDomain {
>          MonoObject obj;
>          MonoObject *identity;
>          MonoDomain *data;
> };
> > That is what my intermediate managed assemblies
> were
> > doing: executing an assembly in the new domain
> which
> > would call mono_domain_get() to get me a
> MonoDomain*
> > for the new MonoAppDomain.
>  >
> > Do I even need a MonoDomain* for the new
> > MonoAppDomain? At the moment I try to allocate any
> > objects used by a script in the AppDomain that I
> > loaded the script's assembly in to, but I suppose
> I
> > could allocate the other objects in the root
> domain.
> > Would there be any problems doing this? My concern
> > would be that the root domain would end up loading
> the
> > script's assembly which I then couldn't unload.
> You have to use the proper MonoDomain.
> Robert

Yahoo! Photos – NEW, now offering a quality print service from just 8p a photo http://uk.photos.yahoo.com

More information about the Mono-devel-list mailing list