Example #1
0
        public static void LoadPlugins()
        {
            string[] PluginFiles = Directory.GetFiles(Program.PluginPath);
            foreach (string file in PluginFiles)
            {
                //判断文件格式是否为.dll格式
                if (Path.GetExtension(file).ToLower() == ".dll" && Plugins.Find(ab => ab.FullPath == file) == null)
                {
                    PluginDomain pluginDomain = file.GetPluginObject(PluginTypes);
                    if (pluginDomain != null && pluginDomain.isSuccess)
                    {
                        PluginItem Pinfo = new PluginItem {
                            FullPath = file
                        };
                        Pinfo.PluginVersion = pluginDomain.GetPropertyValue <Version>("PluginVersion");
                        if (Pinfo.PluginVersion != null)
                        {
                            Pinfo.PluginName = pluginDomain.GetPropertyValue <string>("PluginName");

                            Pinfo.Domain = pluginDomain;
                            Plugins.Add(Pinfo);
                            System.Diagnostics.Debug.WriteLine("加载插件:" + Pinfo.PluginName + " | 版本:" + Pinfo.PluginVersion.ToString());
                        }
                        else
                        {
                            //不匹配卸载
                            pluginDomain.Dispose();
                        }
                    }
                }
            }
        }
Example #2
0
 public void Dispose()
 {
     if (Domain != null)
     {
         Domain.Dispose();
         Domain = null;
     }
 }
Example #3
0
        /// <summary>
        /// 增加模块域
        /// </summary>
        /// <param name="moduleDomain"></param>
        public void AddModulDomain(PluginDomain pluginDomain)
        {
            if (this.PluginDomainCollection.IsInstalled(pluginDomain.ModuleDomainName))
            {
                throw new InvalidDataException(string.Format("已经存在一个相同的{0}插件域", pluginDomain.PluginDomainName));
            }

            this.PluginDomainCollection.Add(pluginDomain);
        }
Example #4
0
        internal Proxy(PluginDomain domain, params object[] args)
        {
            if (domain == null)
            {
                throw new ArgumentNullException("domain");
            }

            _domain = domain;
            _target = (T)((AppDomain)domain).CreateInstanceAndUnwrap(typeof(T).Assembly.FullName, typeof(T).FullName, false, BindingFlags.CreateInstance, null, args, null, null);
        }
    private void CreatePluginDomain(string pluginDomainName, string pluginDirectory)
    {
        _domain = new PluginDomain(pluginDomainName, pluginDirectory);
        var files = GetPluginFiles(pluginDirectory);

        _pluginModifiedDateDictionary.Clear();
        foreach (var file in files)
        {
            _pluginModifiedDateDictionary[file] = File.GetLastWriteTime(file);
        }
    }
Example #6
0
        public void TestIEnumerableByRef()
        {
#if USE_APPDOMAINS
            Console.WriteLine("STARTING");

            PluginDomain pd = new PluginDomain("testdomain");

            IEnumerable <string> x = new CancellableEnumerable <string>(new CancellationTokenSource(), new[] { "this", "is", "cool" });

            pd.InvokeFunc(z => {
                Debug.WriteLine(string.Format("APPDOMAIN NAME :{0}", AppDomain.CurrentDomain.FriendlyName));
                foreach (var n in z)
                {
                    Debug.WriteLine(string.Format("Item :{0}", n));
                }

                return("");
            }, x);

            IEnumerable <Item> items = new CancellableEnumerable <Item>(new CancellationTokenSource(), new[] { new Item {
                                                                                                                   A = "this"
                                                                                                               }, new Item {
                                                                                                                   A = "aint"
                                                                                                               }, new Item {
                                                                                                                   A = "nice"
                                                                                                               } });

            var r = pd.InvokeFunc(z => {
                Debug.WriteLine(string.Format("APPDOMAIN NAME :{0}", AppDomain.CurrentDomain.FriendlyName));
                foreach (var n in z)
                {
                    Debug.WriteLine(string.Format("Item :{0}", n.B));
                }

                IEnumerable <Item> others = new[] { new Item {
                                                        A = "slop"
                                                    }, new Item {
                                                        A = "goop"
                                                    }, new Item {
                                                        A = "chop"
                                                    } };

                return(others);
            }, items);

            foreach (var n in r)
            {
                Debug.WriteLine(string.Format("Item :{0}", n.B));
            }
#endif
        }
Example #7
0
        internal AutoUpdater(PluginDomain domain)
        {
            Domain = domain;
            string tmpName = Guid.NewGuid().ToString().Replace("-", "");

            _tmpDir = Path.Combine(Bridge.TempPath, tmpName);
            Directory.CreateDirectory(_tmpDir);
            _tmpZip    = Path.Combine(Bridge.TempPath, tmpName + ".zip");
            _changelog = domain.UpdatingData.Changelog;
            _lock      = new ManualResetEvent(false);
            _client    = new WebClient();
            _client.DownloadProgressChanged += DownloadProgress;
            _client.DownloadFileCompleted   += DownloadCompleted;
            _progress = new ProgressBar(100);
        }
        /// <summary>
        ///     PROTOTYPE - assembly/provider loader.
        /// </summary>
        /// <param name="primaryAssemblyPath"></param>
        /// <returns></returns>
        private PluginDomain CreatePluginDomain(string primaryAssemblyPath)
        {
            try {
                // this needs to load the assembly in it's own domain
                // so that we can drop them when necessary.
                var name = Path.GetFileNameWithoutExtension(primaryAssemblyPath) ?? primaryAssemblyPath;
                var pd   = new PluginDomain(string.Format(CultureInfo.CurrentCulture, "PluginDomain [{0}]", name.Substring(name.LastIndexOf('.') + 1)));

                // inject this assembly into the target appdomain.
                pd.LoadFileWithReferences(Assembly.GetExecutingAssembly().Location);

                return(pd);
            } catch (Exception e) {
                e.Dump();
            }
            return(null);
        }
Example #9
0
        /// <summary>
        /// Finishes the process and unlocks the main thread.
        /// </summary>
        private void Finish()
        {
            string pluginPath = Path.Combine(Bridge.PluginsPath, Domain.UpdatingData.PluginFile + ".dll");

            Domain = new PluginDomain(Domain.PluginManager, pluginPath);
            Domain.Initialize();
            if (Domain.Plugin.State == PluginState.Failed)
            {
                Domain = null;
                return;
            }

            _progress.Refresh(100, "Finished!");
            Domain.Plugin.Logger.Info("Update v{VER} successfully installed! {CHANGELOG}", Domain.Plugin.Meta.Version,
                                      (string.IsNullOrEmpty(_changelog) ? "" : _changelog));
            _lock.Set();
        }
        private void UnloadAssembly(Assembly assembly)
        {
            PluginDomain pd = null;

            try {
                lock (_domains) {
                    pd = _domains[assembly];
                    _domains.Remove(assembly);
                }
            } catch (Exception e) {
                e.Dump();
            }
            if (pd != null)
            {
                ((IDisposable)pd).Dispose();
            }
            pd = null;
        }
Example #11
0
        /// <summary>
        /// Handles the incoming calling from the native side.
        /// </summary>
        private static object HandleCalling(string key, object[] args)
        {
            try
            {
                if (key == "call-event")
                {
                    int typeId = System.Convert.ToInt32(args[0]);
                    if (typeId == 7 || typeId == 6)
                    {
                        return(true);
                    }
                    EventType type = (EventType)typeId;

                    bool flag = true;
                    PluginManager.IteratePlugins(plugin =>
                    {
                        if (plugin == null || plugin.State == PluginState.Failed)
                        {
                            return;
                        }
                        PluginDomain domain = PluginManager.GetDomain(plugin);
                        if (domain == null)
                        {
                            Logger.Fatal("Could not get plugin domain for loaded plugin {PLUGIN}!", plugin.Display);
                            return;
                        }

                        object[] objArgs = ParseEventArgs(domain, type, args);
                        if (!domain.Server.CallEvent(type, objArgs))
                        {
                            flag = false;
                        }

                        if (type == EventType.PlayerQuit)
                        {
                            domain.Server.PlayerPool.RemoveEntity((Player)objArgs[0]);
                        }
                        else if (type == EventType.PlayerSteamAuth)
                        {
                            Player player = (Player)objArgs[0];
                            lock (Admins)
                            {
                                player.IsAdmin = Admins.Contains(player.SteamID);
                            }
                        }
                        else if (type == EventType.ConsoleInput)
                        {
                            ConsoleManager.PollInput((string)objArgs[0]);
                        }
                    });

                    return(flag);
                }

                if (key == "call-remote")
                {
                    int      player     = System.Convert.ToInt32(args[0]);
                    string   pluginId   = (string)args[1];
                    string   name       = (string)args[2];
                    object[] remoteArgs = new object[args.Length - 3];
                    for (int i = 3; i < args.Length; i++)
                    {
                        remoteArgs[i - 3] = args[i];
                    }

                    Plugin plugin = PluginManager.GetPlugin(pluginId);
                    if (plugin != null)
                    {
                        PluginManager.GetDomain(plugin)?.Server.FireRemoteEvent(name, player, remoteArgs);
                    }

                    return(null);
                }

                if (key == "call-command")
                {
                    string pluginId = (string)args[0];
                    int    player   = System.Convert.ToInt32(args[1]);
                    string name     = (string)args[2];
                    string line     = (string)args[3];
                    if (pluginId == "native")
                    {
                        return(null);
                    }

                    Plugin plugin = PluginManager.GetPlugin(pluginId);
                    if (plugin != null)
                    {
                        PluginManager.GetDomain(plugin)?.Server.FireCommand(player, name, line);
                    }

                    return(null);
                }

                if (key == "call-timer")
                {
                    string id = (string)args[0];
                    Timer.CallTimer(id);
                    return(null);
                }

                if (key == "call-delay")
                {
                    string id = (string)args[0];
                    Timer.CallDelay(id);
                    return(null);
                }

                if (key == "interop")
                {
                    string   pluginId = (string)args[0];
                    string   funcName = (string)args[1];
                    object[] @params  = new object[args.Length - 2];
                    for (int i = 2; i < args.Length; i++)
                    {
                        @params[i - 2] = args[i];
                    }

                    Plugin plugin = PluginManager.GetPlugin(pluginId);
                    return(plugin != null?PluginManager.GetDomain(plugin)?.Server.FireExportable(funcName, @params) : null);
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex,
                             "An error occurred while handling a call {CALLNAME} from the native side! The data which was excepted is the following when debug enabled!",
                             key);
                Logger.Debug("Data for the Call:\n{DATA}", Json.ToJson(args, Json.Flag.Pretty));
            }

            return(null);
        }