// called when an inline assembly is updated
        public static void HandleAssemblyUpdated(string pluginAssemblyInstanceId, List <PluginInfo> pluginList)
        {
            lock (GlobalRegistrations)
            {
                if (GlobalRegistrations.ContainsKey(pluginAssemblyInstanceId))
                {
                    GlobalRegistrations[pluginAssemblyInstanceId].Clear();
                }
                else
                {
                    GlobalRegistrations.Add(pluginAssemblyInstanceId, new List <ServerMethodPluginRegistration>());
                }

                pluginList.ForEach(pluginInfo =>
                {
                    var reg = ServerMethodPluginRegistration.Create(pluginAssemblyInstanceId, pluginInfo);

                    GlobalRegistrations[pluginAssemblyInstanceId].Add(reg);
                });
            }

            lock (EndpointInstanceUse)
            {
                if (EndpointInstanceUse.ContainsKey(pluginAssemblyInstanceId))
                {
                    foreach (var ep in EndpointInstanceUse[pluginAssemblyInstanceId])
                    {
                        ep.HandleAssemblyUpdated(pluginAssemblyInstanceId);
                    }

                    EndpointInstanceUse.Remove(pluginAssemblyInstanceId);
                }
            }
        }
예제 #2
0
        public static ServerMethodPluginRegistration Create(string pluginAssemblyInstanceId, PluginInfo pluginInfo)
        {
            var reg = new ServerMethodPluginRegistration(pluginInfo.Assembly, pluginInfo.TypeInfo, pluginInfo.Guid, pluginAssemblyInstanceId);

            var classLevelAttrib = pluginInfo.TypeInfo.GetCustomAttribute(typeof(ServerMethodAttribute)) as ServerMethodAttribute;

            // static methods not supported
            var methods = pluginInfo.TypeInfo.GetMethods(BindingFlags.Public /* | BindingFlags.Static*/ | BindingFlags.Instance);

            string classLevelNamespace = classLevelAttrib?.Namespace;

            var serverMethodCollection = (from mi in methods
                                          select new
            {
                MethodInfo = mi,
                ServerMethodAttribute = mi.GetCustomAttribute(typeof(ServerMethodAttribute)) as ServerMethodAttribute
            })
                                         .Where(m => m.ServerMethodAttribute != null);

            if (serverMethodCollection.Count() == 0)
            {
                SessionLog.Warning($"No server method's found in plugin '{pluginInfo.Name}' ({pluginInfo.Guid}) from assembly {pluginInfo.Assembly.FullName}. Add a [ServerMethod] attribute to the methods you want to expose.");
            }
            else
            {
                foreach (var m in serverMethodCollection)
                {
                    string ns = m.ServerMethodAttribute?.Namespace;

                    if (ns == null)
                    {
                        ns = classLevelNamespace;
                    }

                    reg.AddMethod(m.MethodInfo.Name, ns, m.MethodInfo);
                }
            }

            reg.ScriptGenerator = ServerMethodScriptGenerator.Create(reg, pluginInfo);


            return(reg);
        }
        public static void Register(string pluginAssemblyInstanceId, PluginInfo pluginInfo)
        {
            try
            {
                var reg = ServerMethodPluginRegistration.Create(pluginAssemblyInstanceId, pluginInfo);

                lock (GlobalRegistrations)
                {
                    if (!GlobalRegistrations.ContainsKey(pluginAssemblyInstanceId))
                    {
                        GlobalRegistrations.Add(pluginAssemblyInstanceId, new List <ServerMethodPluginRegistration>());
                    }

                    GlobalRegistrations[pluginAssemblyInstanceId].Add(reg);
                }
            }
            catch (Exception ex)
            {
                SessionLog.Error($"Failed to instantiate plugin '{pluginInfo.Name}' ({pluginInfo.Guid}) from assembly {pluginInfo.Assembly.FullName}. See exception that follows.");
                SessionLog.Exception(ex);
            }
        }
 public ServerMethodRegistrationMethod(ServerMethodPluginRegistration reg)
 {
     this.Registration = reg;
 }