コード例 #1
0
ファイル: HealerClass.cs プロジェクト: zneel/TheNoobBot
 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;
     }
 }
コード例 #2
0
ファイル: HealerClass.cs プロジェクト: zneel/TheNoobBot
        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);
            }
        }