internal LoaderScriptExtension(string path) : base(path) { _script = File.ReadAllText(Path); _usings = new Usings(); _commands = new List <ScriptedCommand>(); _imports = new List <AssemblyName>(); _container = new ScriptedCommandContainer(this); ExtensionStore.InitExtension(this); Description = System.IO.Path.GetFileName(Path); Load(); foreach (var command in _commands) { var lcInfo = new LoaderCommand(this, command); command.LoaderCommand = lcInfo; AddItem(lcInfo); } var lccInfo = new LoaderCommandContainer(this, _container, typeof(ScriptedCommandContainer)); ExtensionStore.InitCommandContainer(lccInfo, Items.Cast <LoaderCommand>()); AddItem(lccInfo); }
void LoadCommandContainer(TypeDescriptor containerType, AssemblyDescriber describer) { if (containerType.IsAbstract || !containerType.HasPublicParameterlessConstructor) { return; } var methods = describer.GetPublicMethods(containerType); var cmdMethods = (from method in methods let commandAttr = method.APIAttributes.OfType <CommandAttribute>().FirstOrDefault() where commandAttr != null select new { method, commandAttr }).ToArray(); if (cmdMethods.Length == 0) { return; } var dupeCommandNames = from i in cmdMethods group i by i.commandAttr.Name into g where g.Count() > 1 select g; if (dupeCommandNames.Any()) { throw new LoaderItemInitException(string.Format("Duplicate command names in container {0}", containerType)); } var container = CreateLoaderInstance <CommandContainer>(containerType); var commandInfos = new List <LoaderCommand>(); foreach (var method in cmdMethods) { try { var reflectedCmd = new ReflectedCommand(container, method.method, method.commandAttr); var lcInfo = new LoaderCommand(this, reflectedCmd); reflectedCmd.LoaderCommand = lcInfo; commandInfos.Add(lcInfo); } catch (Exception ex) { Debug.WriteLine("Could not initialize command {0} in container {1}: {2}", method.method.Name, containerType, ex.Message); } } var lccInfo = new LoaderCommandContainer(this, container, containerType); ExtensionStore.InitCommandContainer(lccInfo, commandInfos); container.Initialize(Hooks); AddItems(commandInfos); AddItem(lccInfo); }