public static void DisposeHealerClass() { try { lock (HealerClassLocker) { if (_instanceFromOtherAssembly != null) { _instanceFromOtherAssembly.Dispose(); } if (_worker != null) { if (_worker.IsAlive) { _worker.Abort(); } } } } catch (Exception exception) { Logging.WriteError("DisposeHealerClass(): " + exception); } finally { _instanceFromOtherAssembly = null; _assembly = null; _obj = null; } }
public static void LoadHealerClass(string pathToHealerClassFile, bool settingOnly = false, bool resetSettings = false, bool cSharpFile = true) { try { _pathToHealerClassFile = pathToHealerClassFile; if (_instanceFromOtherAssembly != null) { _instanceFromOtherAssembly.Dispose(); } _instanceFromOtherAssembly = null; _assembly = null; _obj = null; if (cSharpFile) { CodeDomProvider cc = new CSharpCodeProvider(); var cp = new CompilerParameters(); IEnumerable <string> assemblies = AppDomain.CurrentDomain .GetAssemblies() .Where( a => !a.IsDynamic && !a.CodeBase.Contains((Process.GetCurrentProcess().ProcessName + ".exe"))) .Select(a => a.Location); cp.ReferencedAssemblies.AddRange(assemblies.ToArray()); StreamReader sr = File.OpenText(pathToHealerClassFile); string toCompile = sr.ReadToEnd(); CompilerResults cr = cc.CompileAssemblyFromSource(cp, toCompile); if (cr.Errors.HasErrors) { String text = cr.Errors.Cast <CompilerError>().Aggregate("Compilator Error :\n", (current, err) => current + (err + "\n")); Logging.WriteError(text); MessageBox.Show(text); return; } _assembly = cr.CompiledAssembly; _obj = _assembly.CreateInstance("Main", true); _threadName = "HealerClass CS"; } else { _assembly = Assembly.LoadFrom(_pathToHealerClassFile); _obj = _assembly.CreateInstance("Main", false); _threadName = "HealerClass DLL"; } if (_obj != null && _assembly != null) { _instanceFromOtherAssembly = _obj as IHealerClass; if (_instanceFromOtherAssembly != null) { if (settingOnly) { if (resetSettings) { _instanceFromOtherAssembly.ResetConfiguration(); } else { _instanceFromOtherAssembly.ShowConfiguration(); } _instanceFromOtherAssembly.Dispose(); return; } _worker = new Thread(_instanceFromOtherAssembly.Initialize) { IsBackground = true, Name = _threadName }; _worker.Start(); } else { Logging.WriteError("Custom Class Loading error."); } } } catch (Exception exception) { Logging.WriteError("LoadHealerClass(string _pathToHealerClassFile): " + exception); } }