Wie Sie programmgesteuert ändern assemblyBinding in der app.config?
Ich versuche, ändern Sie die bindingRedirect element bei der Installation durch die Verwendung der Klasse XmlDocument und ändern Sie den Wert direkt ein. Hier ist, was mein app.config sieht wie folgt aus:
<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>
Ich dann versuchen, den folgenden code zu ändern 1,0 bis 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"));
}
Jedoch wirft es die "nicht gefunden" - exception. Wenn ich wieder den Pfad bis /Konfiguration/runtime funktioniert es. Aber sobald ich hinzufügen assemblyBinding, bedeutet es nicht, suchen Sie nach dem Knoten. Möglicherweise hat dies etwas zu tun mit dem xmlns? Irgendeine Idee, wie ich das ändern kann das? ConfigurationManager auch nicht haben Zugang zu diesem Bereich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich gefunden, was ich brauchte. Der XmlNamespaceManager ist erforderlich, da die assemblyBinding Knoten enthält das Attribut xmlns. Ich veränderte den code, dies und es funktioniert:
Klingt wie habt Ihr die Konfiguration-Datei-tweak funktioniert jetzt, aber ich dachte, dass Sie vielleicht noch interessieren, wie Sie die Bindung leitet zur Laufzeit. Der Schlüssel ist die Verwendung des AppDomain.AssemblyResolve Ereignis, und die details sind in diese Antwort. Ich bevorzuge es über die Verwendung von der Konfigurationsdatei, weil meine Versionsnummer Vergleich ist ein bisschen komplizierter und ich habe nicht zu zwicken die Konfigurations-Datei wird bei jedem build.
Ich denke, dass das Recht Xpath-syntax ist:
/Konfiguration/runtime/assemblyBinding/dependentAssembly/bindingRedirect@neueversion
(Sie haben ein slash zu viel).
Oder wenn dies nicht funktioniert, könnten Sie die bindingRedirect-element (mit SelectSingleNode):
/Konfiguration/runtime/assemblyBinding/dependentAssembly/bindingRedirect
Dann ändern Sie das Attribut newVersion dieses element.