[Mono-dev] Creating AppDomains From Embedded Mono

Robert Jordan robertj at gmx.net
Tue Jan 10 23:30:46 EST 2006


Hey,

> I seem to have fixed my build problems: I ran make
> again without changing anything and managed to build
> the mono 1.1.13 tree in cygwin with the mono 1.1.13
> windows installation. Slightly disconcerting as it
> crashed the last time I tried it...
> 
> I can run the Second Life simulator again and have it
> load the new 1.1.13 mono.dll, run ilasm.exe and my
> bytecode transformer, but the evil hack I've been
> using to create new AppDomains for the Mono scripts
> seems to be unravelling.
> 
> To create a domain I execute an assembly in the root
> domain which creates another domain and executes
> another assembly:
> 
> public static void Main() 
> {
>   AppDomain new_domain =
>   AppDomain.CreateDomain("Secondary Domain" +
> sDomainIndex++);
>   new_domain.ExecuteAssembly("DomainRegister.exe");
> }
> 
> DomainRegister.exe then just makes an internal call
> which uses mono_domain_get to give me a C reference to
> the new domain, which is set up properly by the C#
> code. mono_domain_set can then be used from C code to
> switch
> between secondary domains without any problems.
> 
> public class DomainRegister
> {
>  
> [MethodImplAttribute(MethodImplOptions.InternalCall)]
>   public extern static void register_domain();
> 
>   public static void Main()
>   {
>     register_domain();
>   }
> }	
> 
> Everything I tried to do in C to create the domain
> left it partially initialised and things would crash
> later on.
> 
> To unload domains I just call
> ves_icall_System_AppDomain_InternalUnload which I have
> to declare as an extern as it's not in the public
> headers. Again, it's a hack, but it seems to work.
> 
> Does anyone know what might have changed recently to
> cause this to crash on Windows when the
> AppDomain.CreateDomain call is made?
> 
> Even better, is it now possible to create properly
> initialised AppDomains using the embedding API without
> having to call in to managed code and then back in to
> unmanaged code again?

No, but 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)
{
     MonoClass *ad_class;
     MonoMethod *create_domain_method;
     gpointer params [1];

     ad_class = mono_class_from_name (mono_get_corlib (),
         "System", "AppDomain");

     create_domain_method = mono_class_get_method_from_name (clazz,
         "CreateDomain", 1);

     params [0] = mono_string_new_wrapper (name);
     return (MonoAppDomain *)
         mono_runtime_invoke (create_domain_method, NULL, params, NULL);
}

void
unloadDomain (MonoAppDomain *domain)
{
     MonoClass *ad_class;
     MonoMethod *unload_domain_method;
     gpointer params [1];

     ad_class = mono_class_from_name (mono_get_corlib (),
         "System", "AppDomain");

     unload_domain_method = mono_class_get_method_from_name (clazz,
         "Unload", 1);

     params [0] = domain;
     mono_runtime_invoke (unload_domain_method, NULL, params, NULL);
}

Robert




More information about the Mono-devel-list mailing list