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.
}