private static void LoadScripts(Queue <IServerScript> scripts) { if (scripts.Count > 0) { IServerScript iscript = scripts.Dequeue(); ServerScript script = (ServerScript)iscript; ((ILease)script.GetLifetimeService()).Register(instance); script.timer = new ScriptTimer(script, 100, (timer) => { try { iscript.Tick(); } catch (Exception e) { instance.Print(PrintType.Error, "\"" + iscript.Name + "\"'s Tick() failed."); instance.PrintException(e); } }, true); ((ILease)script.timer.GetLifetimeService()).Register(instance); instance.Print("Creating proxy for script \"" + iscript.Name + "\"..."); script.CreateProxy(instance, scripts); } }
private static void Unload(string path) { instance.Print("Unloading scripts in \"" + path + "\"..."); AppDomain oldAppDomain = null; List <IServerScript> oldscripts = new List <IServerScript>(); if (_scripts.ContainsKey(path)) { oldscripts = _scripts[path]; _scripts.Remove(path); oldAppDomain = SeparateAppDomain.Extract(path); } instance.Print(oldscripts.Count + " script(s) unloaded from \"" + path + "\"."); instance.Print(""); ScriptTimer[] timers; lock (ScriptTimers) timers = ScriptTimers.ToArray(); foreach (IServerScript iscript in oldscripts) { foreach (ScriptTimer st in timers.Where(st => st.caller == iscript)) { st.Dispose(); } lock (scripteventhandlers) { if (scripteventhandlers.ContainsKey(iscript)) { foreach (string eventname in scripteventhandlers[iscript].Keys) { try { instance.RemoveAllEventHandlers((ServerScript)iscript, eventname); ((ServerScript)iscript).RemoveAllEventHandlers(eventname); } catch (Exception e) { instance.Print(PrintType.Error, "Failed to remove \"" + iscript.Name + "\"'s event handlers for event \"" + eventname + "\"."); instance.PrintException(e); } } scripteventhandlers[iscript].Clear(); scripteventhandlers.Remove(iscript); } } ServerScript script = ((ServerScript)iscript); if (script.timer != null) { script.timer.Dispose(); } try { iscript.Unload(); } catch (Exception e) { instance.Print(PrintType.Error, "\"" + iscript.Name + "\"'s Unload() failed."); instance.PrintException(e); } ((ILease)script.GetLifetimeService()).Unregister(instance); } lock (scripteventhandlers) scripteventhandlers.Clear(); //assemblies.Clear(); if (oldAppDomain != null) { AppDomain.Unload(oldAppDomain); } }