diff --git a/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs b/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs index 03d23b8e0e..35e67775fa 100644 --- a/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs +++ b/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs @@ -227,6 +227,7 @@ namespace ICSharpCode.Core } string fileName = Path.Combine(hintPath, reader.GetAttribute(0)); XmlReaderSettings xrs = new XmlReaderSettings(); + xrs.NameTable = reader.NameTable; // share the name table xrs.ConformanceLevel = ConformanceLevel.Fragment; using (XmlReader includeReader = XmlTextReader.Create(fileName, xrs)) { SetupAddIn(includeReader, addIn, Path.GetDirectoryName(fileName)); @@ -260,16 +261,13 @@ namespace ICSharpCode.Core return paths[pathName]; } - public static AddIn Load(TextReader textReader) - { - return Load(textReader, null); - } - - public static AddIn Load(TextReader textReader, string hintPath) + public static AddIn Load(TextReader textReader, string hintPath = null, XmlNameTable nameTable = null) { + if (nameTable == null) + nameTable = new NameTable(); try { AddIn addIn = new AddIn(); - using (XmlTextReader reader = new XmlTextReader(textReader)) { + using (XmlTextReader reader = new XmlTextReader(textReader, nameTable)) { while (reader.Read()){ if (reader.IsStartElement()) { switch (reader.LocalName) { @@ -289,14 +287,16 @@ namespace ICSharpCode.Core } } - public static AddIn Load(string fileName) + public static AddIn Load(string fileName, XmlNameTable nameTable = null) { try { using (TextReader textReader = File.OpenText(fileName)) { - AddIn addIn = Load(textReader, Path.GetDirectoryName(fileName)); + AddIn addIn = Load(textReader, Path.GetDirectoryName(fileName), nameTable); addIn.addInFileName = fileName; return addIn; } + } catch (AddInLoadException) { + throw; } catch (Exception e) { throw new AddInLoadException("Can't load " + fileName, e); } diff --git a/src/Main/Core/Project/Src/AddInTree/AddInManager.cs b/src/Main/Core/Project/Src/AddInTree/AddInManager.cs index 53481c3d76..baa646819d 100644 --- a/src/Main/Core/Project/Src/AddInTree/AddInManager.cs +++ b/src/Main/Core/Project/Src/AddInTree/AddInManager.cs @@ -260,7 +260,7 @@ namespace ICSharpCode.Core /// /// /// The list of AddIns to add. (use instances - /// created by ). + /// created by ). /// public static void AddExternalAddIns(IList addIns) { diff --git a/src/Main/Core/Project/Src/AddInTree/AddInTree.cs b/src/Main/Core/Project/Src/AddInTree/AddInTree.cs index 82f36690dd..6ab5df49d7 100644 --- a/src/Main/Core/Project/Src/AddInTree/AddInTree.cs +++ b/src/Main/Core/Project/Src/AddInTree/AddInTree.cs @@ -347,10 +347,11 @@ namespace ICSharpCode.Core List list = new List(); Dictionary dict = new Dictionary(); Dictionary addInDict = new Dictionary(); + var nameTable = new System.Xml.NameTable(); foreach (string fileName in addInFiles) { AddIn addIn; try { - addIn = AddIn.Load(fileName); + addIn = AddIn.Load(fileName, nameTable); } catch (AddInLoadException ex) { LoggingService.Error(ex); if (ex.InnerException != null) { diff --git a/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs b/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs index 04eb473685..b2d2a0cda3 100644 --- a/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs +++ b/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs @@ -151,7 +151,11 @@ namespace ICSharpCode.Core if (reader.HasAttributes) { for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); - properties[reader.Name] = reader.Value; + // some values are frequently repeated (e.g. type="MenuItem"), + // so we also use the NameTable for attribute values + // (XmlReader itself only uses it for attribute names) + string val = reader.NameTable.Add(reader.Value); + properties[reader.Name] = val; } reader.MoveToElement(); //Moves the reader back to the element node. }