программно добавить зависимую сборку в runtime \ assemblyBinding - PullRequest
4 голосов
/ 22 декабря 2010

Я пытаюсь добавить новую зависимую сборку в мой файл Web.config во время выполнения.Пока что мой текущий код имеет

    XmlNamespaceManager manager = new XmlNamespaceManager (WebConfigDoc.NameTable);
    manager.AddNamespace("bindings", "urn:schemas-microsoft-com:asm.v1");

    XmlNode root = WebConfigDoc.DocumentElement;

    XmlNode assemblyBinding = root.SelectSingleNode("//bindings:assemblyBinding", manager);          

    XmlNode newAssemblyBinding = WebConfigDoc.ImportNode(GetElement(MyNewNode()), true);

    assemblyBinding.AppendChild(newAssemblyBinding);    
}

private string MyNewNode()
{    
    string Node = "<dependentAssembly>" +
                  "<assemblyIdentity name=\"newone\" "+
                  " publicKeyToken=\"608967\" />" +
                  "<bindingRedirect oldVersion=\"1\" newwVersion=\"2\" />" +
                  "</dependentAssembly>";
    return Node ;  
}

Это работает, но в результате получается узел

<dependentAssembly xmlns="">
    <assemblyIdentity name="newone" publicKeyToken="608967" />
    <bindingRedirect oldVersion="1" newVersion="2" />
 </dependentAssembly>

Мне не нужно атрибут xmlns="", который нужно добавить.Есть ли лучший способ сделать это?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

Проблема в том, что добавляемый вами новый узел находится в «пространстве имен», а родительский - в пространстве имен «urn: schemas-microsoft-com: asm.v1».

Решение

Изменение

  string Node = "<dependentAssembly>" + 

до

  string Node = "<dependentAssembly xmlns='urn:schemas-microsoft-com:asm.v1'>" + 
1 голос
/ 23 декабря 2010

Я не уверен, почему не работает XML-сериализатор. Пространство имен правильное, поскольку объект XmlNode assemblyBinding не является нулевым, а указанный код - то, что я делаю, и ничего более. Это может произойти из-за метода GetElement, который создает XmlNode из строки и возвращает новый элемент документа.

private static XmlElement GetElement(string xml)
        {
            //convert string to xml element
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            return doc.DocumentElement;
        }

В любом случае я достиг результата с помощью XPathNavigator. Моя окончательная версия.

XmlNamespaceManager manager = new XmlNamespaceManager (WebConfigDoc.NameTable);
        manager.AddNamespace("bindings", "urn:schemas-microsoft-com:asm.v1");

        XmlNode root = WebConfigDoc.DocumentElement;


XPathNavigator assemblyBinding = root.CreateNavigator().
                                                 SelectSingleNode("//bindings:assemblyBinding", manager);

               assemblyBinding.AppendChild(MyNewNode());

private string MyNewNode()
{

   string Node = "<dependentAssembly>" +
                                      "<assemblyIdentity name=\"newone\" "+
                                      " publicKeyToken=\"608967\" />" +
                                      "<bindingRedirect oldVersion=\"1\" newwVersion=\"2\" />" +
                                    "</dependentAssembly>";
            return Node ;  
}

Спасибо за помощь.

...