[Mono-devel-list] Re: Assembly Unloading

Zoltan Varga vargaz at gmail.com
Wed May 25 14:37:29 EDT 2005


                                        Hi,

  Appdomains should be unloaded using mono_domain_unload (), not
mono_domain_free (). The current domain of the current thread can be set
using mono_domain_set ().

                   Zoltan

On 5/25/05, Jim Purbrick <jimpurbrick at yahoo.co.uk> wrote:
> > Now that Sebastien has helped make the security
> > situation clearer, I think unloading assemblies is
> > (hopefully) the last big issue I need to resolve.
> 
> I now have a bytecode translator implemented which can
> save and restore running code to serializable heap
> objects and can check method calls against a white
> list of allowed methods, so now I'm looking at how to
> unload assemblies and JIT output when a script stops
> or is serialized to a new server.
> 
> Zoltan convinced me that messing with the runtime to
> try to unload assemblies was a bad idea and looking at
> the DynamicMethod mechanisms provided by LCG it seems
> that only static methods can be dynamically created
> and  collected.
> 
> So, now I'm looking at Richards suggestion of just
> serializing all the scripts to disk, destroying the
> current domain, creating a new one and loading the
> scripts in to the new domain.
> 
> What i'm currently trying is:
> 
> 1) mono_jit_init("root domain");
> 2) domain = mono_domain_create();
> 3) Load assembly in to domain.
> 4) Run script.
> 5) Serialize running script to file.
> 6) mono_domain_free(domain, true);
> 7) domain = mono_domain_create();
> 8) Deserialize script from file.
> 
> Looping this process I can run, save, load and run.
> However, when I come to save the script for the second
> time the application crashes with the call stack
> below. If I remove the domain creation and destruction
> steps the application will continue to loop, saving
> and loading itself to and from file.
> 
> Another concern is that when I list the assemblies
> using AppDomain.CurrentDomain.GetAssemblies() The
> current domain is always the root and always contains
> my script assembly, even though I only load the script
> assembly in to the secondary domain.
> 
> Does anyone know what I'm doing wrong here? Do
> assemblies get loaded when I deserialize a script from
> disk? If so how do I control which domain they get
> loaded in to? Are there any examples for this stuff?
> Should I be doing this from managed code? (I'd rather
> not)
> 
> Cheers,
> 
> Jim.
> 
> Heres the call stack I get when I try to save for a
> second time. I'm using Mono 1.1.7 on Debian and
> Windows and get the same crash on both.
> 
> System.NullReferenceException: Object reference not
> set to an instance of an object
> in <0x00030> System.Type:Equals (System.Object o)
> in <0x0001e> System.Collections.Hashtable:KeyEquals
> (System.Object item, System.Object key)
> in <0x00144> System.Collections.Hashtable:get_Item
> (System.Object key)
> in <0x00535>
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter:GetObjectData
> (System.Object obj,
> System.Runtime.Serialization.Formatters.Binary.TypeMetadata
> metadata, System.Object data)
> in <0x0003f>
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter:WriteObject
> (System.IO.BinaryWriter writer, Int64 id,
> System.Object obj)
> in <0x0014d>
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter:WriteObjectInstance
> (System.IO.BinaryWriter writer, System.Object obj,
> Boolean isValueObject)
> in <0x00039>
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter:WriteQueuedObjects
> (System.IO.BinaryWriter writer)
> in <0x00049>
> System.Runtime.Serialization.Formatters.Binary.ObjectWriter:WriteObjectGraph
> (System.IO.BinaryWriter writer, System.Object obj,
> System.Runtime.Remoting.Messaging.Header[] headers)
> in <0x002ce>
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter:Serialize
> (System.IO.Stream serializationStream, System.Object
> graph, System.Runtime.Remoting.Messaging.Header[]
> headers)
> in <0x00015>
> System.Runtime.Serialization.Formatters.Binary.BinaryFormatter:Serialize
> (System.IO.Stream serializationStream, System.Object
> graph)
> in <0x000b5> UThread.UThread:Save (System.String filename)
> 
> 
> 
> 
> 
> ___________________________________________________________
> Yahoo! Messenger - NEW crystal clear PC to PC calling worldwide with voicemail http://uk.messenger.yahoo.com
>



More information about the Mono-devel-list mailing list