Comment modifier par programmation assemblyBinding dans l'app.config?
Je suis en train de changer la bindingRedirect élément au moment de l'installation à l'aide de la classe XmlDocument et de modifier directement la valeur. Voici ce que mon application.config ressemble:
<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>
Je puis essayez d'utiliser le code suivant pour changer 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 jette la 'introuvable' exception. Si je sauvegarde le chemin jusqu'à /configuration/exécution, il fonctionne. Cependant, une fois que j'ai ajouter assemblyBinding, il ne trouve pas le nœud. Éventuellement, cela a quelque chose à voir avec la xmlns? Une idée de comment je peux modifier cela? ConfigurationManager aussi ne pas avoir accès à cette section.
OriginalL'auteur esac | 2009-04-30
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé ce dont j'avais besoin. La XmlNamespaceManager est nécessaire que le assemblyBinding nœud contient l'attribut xmlns. J'ai modifié le code pour l'utiliser et il fonctionne:
OriginalL'auteur esac
Semble que vous avez votre fichier de configuration tweak de travail maintenant, mais j'ai pensé que vous pourriez toujours être intéressés à la façon de régler la liaison redirige au moment de l'exécution. La clé est d'utiliser le Domaine d'application.AssemblyResolve de l'événement, et les détails sont dans cette réponse. Je la préfère à l'aide du fichier de configuration, parce que mon numéro de version de comparaison peut être un peu plus sophistiqué et je ne pas avoir à modifier le fichier de configuration au cours de chaque génération.
Cela fonctionne, si l'assemblée de la charge échoue. Toutefois, si votre application gère les charger avec succès le mal de l'assemblée, le AssemblyResolve se déclenche jamais. Donc, la seule option dans ce cas est de modifier l'application.config.
Souhaite que je pourrais rétracter mon vote. En fait, cela ne fonctionne pas si la liaison est établie, comme le de .NET 4.6.1. Toujours obtenir de l'assemblée de liaison des échecs.
OriginalL'auteur Don Kirkby
Je pense que la bonne syntaxe Xpath est:
/configuration/runtime/assemblyBinding/dependentAssembly/bindingRedirect@nouvelleversion
(vous avez un slash en trop grand nombre).
Ou si cela ne fonctionne pas, vous pouvez sélectionner le bindingRedirect élément (à l'aide de SelectSingleNode):
/configuration/runtime/assemblyBinding/dependentAssembly/bindingRedirect
Ensuite modifier l'attribut nouvelleversion de cet élément.
OriginalL'auteur Joe