/// <summary> /// スクリプトを読み込み、コンパイルします。 /// </summary> public static void reload() { // 拡張子がcs, txtのファイルを列挙 String dir = Utility.getScriptPath(); Vector <String> files = new Vector <String>(); files.addAll(Arrays.asList(PortUtil.listFiles(dir, ".txt"))); files.addAll(Arrays.asList(PortUtil.listFiles(dir, ".cs"))); // 既存のスクリプトに無いまたは新しいやつはロード。 Vector <String> added = new Vector <String>(); //追加または更新が行われたスクリプトのID foreach (String file in files) { String id = PortUtil.getFileName(file); double time = PortUtil.getFileLastModified(file); added.add(id); boolean loadthis = true; if (scripts.containsKey(id)) { double otime = scripts.get(id).fileTimestamp; if (time <= otime) { // 前回コンパイルした時点でのスクリプトファイルよりも更新日が同じか古い。 loadthis = false; } } // ロードする処理 if (!loadthis) { continue; } ScriptInvoker si = (new PluginLoader()).loadScript(file); scripts.put(id, si); } // 削除されたスクリプトがあれば登録を解除する boolean changed = true; while (changed) { changed = false; for (Iterator <String> itr = scripts.keySet().iterator(); itr.hasNext();) { String id = itr.next(); if (!added.contains(id)) { scripts.remove(id); changed = true; break; } } } }
/// <summary> /// スクリプトを読み込み、コンパイルします。 /// </summary> public static void reload() { // 拡張子がcs, txtのファイルを列挙 string dir = Utility.getScriptPath(); List <string> files = new List <string>(); files.AddRange(new List <string>(PortUtil.listFiles(dir, ".txt"))); files.AddRange(new List <string>(PortUtil.listFiles(dir, ".cs"))); // 既存のスクリプトに無いまたは新しいやつはロード。 List <string> added = new List <string>(); //追加または更新が行われたスクリプトのID foreach (string file in files) { string id = PortUtil.getFileName(file); double time = PortUtil.getFileLastModified(file); added.Add(id); bool loadthis = true; if (scripts.ContainsKey(id)) { double otime = scripts[id].fileTimestamp; if (time <= otime) { // 前回コンパイルした時点でのスクリプトファイルよりも更新日が同じか古い。 loadthis = false; } } // ロードする処理 if (!loadthis) { continue; } ScriptInvoker si = (new PluginLoader()).loadScript(file); scripts[id] = si; } // 削除されたスクリプトがあれば登録を解除する bool changed = true; while (changed) { changed = false; foreach (var id in scripts.Keys) { if (!added.Contains(id)) { scripts.Remove(id); changed = true; break; } } } }
/// <summary> /// 指定されたファイルを読み込んでスクリプトをコンパイルします. /// </summary> /// <param name="file">スクリプトを発動するのに使用するコンテナを返します.</param> /// <returns></returns> #if ENABLE_SCRIPT public ScriptInvoker loadScript(String file) { ScriptInvoker ret = new ScriptInvoker(); ret.ScriptFile = file; ret.fileTimestamp = PortUtil.getFileLastModified(file); // スクリプトの記述のうち、以下のリストに当てはまる部分は空文字に置換される string config_file = ScriptServer.configFileNameFromScriptFileName(file); string script = ""; using (StreamReader sr = new StreamReader(file)) { script += sr.ReadToEnd(); } var code = createPluginCode(script); ret.ErrorMessage = ""; List <string> errors = new List <string>(); Assembly testAssembly = compileScript(code, errors); if (testAssembly == null) { ret.scriptDelegate = null; if (errors.Count == 0) { ret.ErrorMessage = "failed compiling"; } else { for (int i = 0; i < errors.Count; i++) { ret.ErrorMessage += errors[i] + "\r\n"; } } return(ret); } else { foreach (Type implemented in testAssembly.GetTypes()) { Object scriptDelegate = null; ScriptDelegateGetDisplayName getDisplayNameDelegate = null; MethodInfo get_displayname_delegate = implemented.GetMethod("GetDisplayName", new Type[] { }); if (get_displayname_delegate != null && get_displayname_delegate.IsStatic && get_displayname_delegate.IsPublic) { if (get_displayname_delegate.ReturnType.Equals(typeof(String))) { getDisplayNameDelegate = (ScriptDelegateGetDisplayName)Delegate.CreateDelegate(typeof(ScriptDelegateGetDisplayName), get_displayname_delegate); } } MethodInfo tmi = implemented.GetMethod("Edit", new Type[] { typeof(VsqFile) }); if (tmi != null && tmi.IsStatic && tmi.IsPublic) { if (tmi.ReturnType.Equals(typeof(bool))) { scriptDelegate = (EditVsqScriptDelegate)Delegate.CreateDelegate(typeof(EditVsqScriptDelegate), tmi); } else if (tmi.ReturnType.Equals(typeof(ScriptReturnStatus))) { scriptDelegate = (EditVsqScriptDelegateWithStatus)Delegate.CreateDelegate(typeof(EditVsqScriptDelegateWithStatus), tmi); } } tmi = implemented.GetMethod("Edit", new Type[] { typeof(VsqFileEx) }); if (tmi != null && tmi.IsStatic && tmi.IsPublic) { if (tmi.ReturnType.Equals(typeof(bool))) { scriptDelegate = (EditVsqScriptDelegateEx)Delegate.CreateDelegate(typeof(EditVsqScriptDelegateEx), tmi); } else if (tmi.ReturnType.Equals(typeof(ScriptReturnStatus))) { scriptDelegate = (EditVsqScriptDelegateExWithStatus)Delegate.CreateDelegate(typeof(EditVsqScriptDelegateExWithStatus), tmi); } } if (scriptDelegate != null) { ret.ScriptType = implemented; ret.scriptDelegate = scriptDelegate; ret.Serializer = new XmlStaticMemberSerializerEx(implemented); ret.getDisplayNameDelegate = getDisplayNameDelegate; if (!File.Exists(config_file)) { continue; } // 設定ファイルからDeserialize System.IO.FileStream fs = null; bool delete_when_exit = false; try { fs = new System.IO.FileStream(config_file, System.IO.FileMode.Open, System.IO.FileAccess.Read); ret.Serializer.deserialize(fs); } catch (Exception ex) { serr.println("Utility#loadScript; ex=" + ex); Logger.write(typeof(Utility) + ".loadScript; ex=" + ex + "\n"); delete_when_exit = true; } finally { if (fs != null) { try { fs.Close(); if (delete_when_exit) { System.IO.File.Delete(config_file); } } catch (Exception ex2) { serr.println("Utility#loadScript; ex2=" + ex2); Logger.write(typeof(Utility) + ".loadScritp; ex=" + ex2 + "\n"); } } } } else { ret.ErrorMessage = _("'Edit' Method not implemented"); } } } return(ret); }