以编程方式将dependentAssembly添加到runtime \ assemblyBinding

时间:2010-12-22 18:14:14

标签: c# dom xml-namespaces

我正在尝试在运行时向我的Web.config文件添加新的dependentAssembly。到目前为止,我目前的代码已经

    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 个答案:

答案 0 :(得分:2)

问题是因为您添加的新节点位于“no namespace”,而父节点位于“urn:schemas-microsoft-com:asm.v1”命名空间中。

<强>解决方案

更改

  string Node = "<dependentAssembly>" + 

  string Node = "<dependentAssembly xmlns='urn:schemas-microsoft-com:asm.v1'>" + 

答案 1 :(得分:1)

我不确定为什么它不起作用可能是XML序列化程序。名称空间是正确的,因为XmlNode assemblyBinding对象不为null,我指定的代码就是我正在做的事情,仅此而已。可能是因为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 ;  
}

感谢您的帮助。