// 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); } } }
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; }