using Microsoft.CSharp; using System; //Copyright (c) NorbiPeti 2015 - See LICENSE file using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace MSGer.tk { [Serializable] public class ScriptInAppDomain { [NonSerialized] private AppDomain appdomain; private string path; public string Path { get { path = (appdomain.GetData(DataName) as ScriptInAppDomain).path; return path; } set { path = value; appdomain.SetData(DataName, this); } } private bool success; public bool Success { get { success = (appdomain.GetData(DataName) as ScriptInAppDomain).success; return success; } set { success = value; appdomain.SetData(DataName, this); } } [NonSerialized] private IScript script; private IScript Script { get { script = (appdomain.GetData(DataName) as ScriptInAppDomain).script; return script; } set { script = value; appdomain.SetData(DataName, this); } } private CompilerErrorCollection compilererrors; public CompilerErrorCollection CompilerErrors { get { compilererrors = (appdomain.GetData(DataName) as ScriptInAppDomain).compilererrors; return compilererrors; } set { compilererrors = value; appdomain.SetData(DataName, this); } } public ScriptInAppDomain(string path, AppDomain domain) { appdomain = domain; //Ez remélhetőleg megoldja, hogy mindig a jó AppDomain-ből szerezze az adatokat Path = path; } public void LoadInAppDomain() { string code = File.ReadAllText(Path); CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerParameters parameters = new CompilerParameters(); //parameters.ReferencedAssemblies.Add(""); parameters.GenerateInMemory = true; parameters.GenerateExecutable = false; foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { string location = assembly.Location; if (!String.IsNullOrEmpty(location)) { parameters.ReferencedAssemblies.Add(location); } } catch (NotSupportedException) { // this happens for dynamic assemblies, so just ignore it. } } CompilerResults results = provider.CompileAssemblyFromSource(parameters, code); if (results.Errors.HasErrors) { Success = false; //Automatikusan beállítja return; } else //A fordítás sikeres { Assembly asm = results.CompiledAssembly; foreach (var type in asm.GetTypes()) { if (type.IsClass && typeof(IScript).IsAssignableFrom(type)) { var script = Activator.CreateInstance(type) as IScript; if (script != null) { Script = script; Script.Load(); //Lefuttatja a szkript Load() függvényét break; } } } if (Script == null) Success = false; else Success = true; return; } } public void UnloadInAppDomain() { Script.Unload(); } public void JustCompileInAppDomain() { string code = File.ReadAllText(Path); CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerParameters parameters = new CompilerParameters(); parameters.GenerateInMemory = true; parameters.GenerateExecutable = false; foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { string location = assembly.Location; if (!String.IsNullOrEmpty(location)) { parameters.ReferencedAssemblies.Add(location); } } catch (NotSupportedException) { // this happens for dynamic assemblies, so just ignore it. } } CompilerResults results = provider.CompileAssemblyFromSource(parameters, code); CompilerErrors = results.Errors; //.Errors: 2015.04.10. } public const string DataName = "PluginContextData"; } }