Exemple #1
0
        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);
            }
        }