Question

J'essaie de modifier l'élément bindingRedirect au moment de l'installation en utilisant la classe XmlDocument et en modifiant directement la valeur. Voici à quoi ressemble mon app.config:

<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">            
            ...
        </sectionGroup>      
    </configSections>
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
          <assemblyIdentity name="MyDll" publicKeyToken="31bfe856bd364e35"/>
          <bindingRedirect oldVersion="0.7" newVersion="1.0"/>
        </dependentAssembly>
     </assemblyBinding>
    </runtime>    
...
</configuration>

J'essaie ensuite d'utiliser le code suivant pour passer de 1.0 à 2.0

private void SetRuntimeBinding(string path, string value)
{
    XmlDocument xml = new XmlDocument();

    xml.Load(Path.Combine(path, "MyApp.exe.config"));
    XmlNode root = xml.DocumentElement;

    if (root == null)
    {
        return;
    }

    XmlNode node = root.SelectSingleNode("/configuration/runtime/assemblyBinding/dependentAssembly/bindingRedirect/@newVersion");

    if (node == null)
    {
        throw (new Exception("not found"));
    }

    node.Value = value;

    xml.Save(Path.Combine(path, "MyApp.exe.config"));
}

Cependant, il lève l'exception "non trouvé". Si je sauvegarde le chemin jusqu’à / configuration / runtime, cela fonctionne. Cependant, une fois que j'ai ajouté assemblyBinding, il ne trouve pas le noeud. Cela a peut-être quelque chose à voir avec les xmlns? Une idée de comment je peux modifier cela? ConfigurationManager n’a pas non plus accès à cette section.

Était-ce utile?

La solution

J'ai trouvé ce dont j'avais besoin. XmlNamespaceManager est requis car le nœud assemblyBinding contient l'attribut xmlns. J'ai modifié le code pour l'utiliser et cela fonctionne:

    private void SetRuntimeBinding(string path, string value)
    {
        XmlDocument doc = new XmlDocument();

        try
        {
            doc.Load(Path.Combine(path, "MyApp.exe.config"));
        }
        catch (FileNotFoundException)
        {
            return;
        }

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

        XmlNode root = doc.DocumentElement;

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

        if (node == null)
        {
            throw (new Exception("Invalid Configuration File"));
        }

        node = node.SelectSingleNode("@newVersion");

        if (node == null)
        {
            throw (new Exception("Invalid Configuration File"));
        }

        node.Value = value;

        doc.Save(Path.Combine(path, "MyApp.exe.config"));
    }

Autres conseils

On dirait que votre modification de fichier de configuration fonctionne maintenant, mais je pensais que vous pourriez toujours être intéressé par la façon d'ajuster les redirections de liaison au moment de l'exécution. La clé consiste à utiliser l'événement AppDomain.AssemblyResolve . et les détails se trouvent dans cette réponse . Je préfère utiliser le fichier de configuration, car la comparaison des numéros de version peut être un peu plus complexe et je n’ai pas à modifier le fichier de configuration à chaque construction.

Je pense que la bonne syntaxe Xpath est la suivante:

/ configuration / runtime / assemblyBinding / dependAssembly / bindingRedirect @ newVersion

(vous avez trop de barres obliques).

Ou si cela ne fonctionne pas, vous pouvez sélectionner l'élément bindingRedirect (à l'aide de SelectSingleNode):

/ configuration / runtime / assemblyBinding / dependAssembly / bindingRedirect

Modifiez ensuite l'attribut newVersion de cet élément.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top