2009-01-22 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / web / embedded-api
index 12e0c30450b4b239c476f9d1c04985890231420d..3b405c98ddd191575e917267cc3f469c39528146 100755 (executable)
        not interfere with code in other domains.  This is useful if
        you want to host different applications in your program.  
 
-       Then you can load an assembly containing code into the domain:
+       Now, it is necessary to transfer control to Mono, and setup
+       the threading infrastructure, you do this like this:
 
        <pre>
+               void *user_data = NULL;
+
+               mono_runtime_exec_managed_code (domain, main_thread_handler, user_data);
+       </pre>
+
+       Where your main_thread_handler can load your assembly and execute it:
+
+       <pre>
+       static void main_thread_handler (gpointer user_data)
+       {       
                MonoAssembly *assembly;
 
                assembly = mono_domain_assembly_open (domain, "file.dll");
 
        The Boehm GC system needs to catch your calls to the pthreads
        layer, so in each file where you use pthread.h you should
-       include the <gc/gc.h> file.  
+       include the &lt;gc/gc.h&gt; file.  
+
+       If you can not do this for any reasons, just remember that you
+       can not store pointers to Mono Objects on the stack, you can
+       store them safely in the heap, or in global variables though
 
 * Exposing C code to the CIL universe
 
        It may not be possible to manage exceptions in that case,
        though. I need to think more about it.
 
+** Threading issues
+
+       If your application creates threads on its own, and you want them to 
+       be able to call code into the CIL universe with Mono, you have to
+       register the thread with Mono before issuing the call.
+
+       To do so, call the mono_thread_attach() function before you execute
+       any managed code from the thread
+
 * Samples
 
        See the sample programs in mono/sample/embed for examples of