Puis-je contrôler l'emplacement des paramètres utilisateur .NET pour éviter de perdre des paramètres lors de la mise à niveau de l'application?

StackOverflow https://stackoverflow.com/questions/621265

  •  05-07-2019
  •  | 
  •  

Question

J'essaie de personnaliser l'emplacement du fichier user.config. Actuellement, il est stocké avec un hachage et un numéro de version

%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\

Je veux qu'il soit agnostique par rapport à la version de l'application

%AppData%\[CompanyName]\[ProductName]\

Cela peut-il être fait et comment? Quelles sont les implications? L'utilisateur perdra-t-il ses paramètres de la version précédente après la mise à niveau?

Était-ce utile?

La solution

Pour répondre à la première question, vous pouvez techniquement placer le fichier où vous voulez, mais vous devrez le coder vous-même, car l'emplacement par défaut du fichier est le premier de vos deux exemples. ( lien permettant de le faire vous-même )

En ce qui concerne la deuxième question, cela dépend de la manière dont vous déployez l'application. Si vous déployez via un fichier .msi, il y a alors deux hachages dans les propriétés du projet d'installation (à partir duquel le msi est construit), le "code de mise à niveau" et le "code de produit". Celles-ci déterminent comment le MSI peut être installé et s'il met à niveau, écrase ou installe à côté d'une autre version de la même application.

Par exemple, si vous avez deux versions de votre logiciel et qu'elles ont des codes de «mise à niveau» différents, alors pour Windows, ce sont des logiciels complètement différents, quel que soit leur nom. Toutefois, si le code de «mise à niveau» est le même, mais que le code de «produit» est différent, lorsque vous essayez d'installer le 2nd MSI, il vous demande si vous souhaitez effectuer une mise à niveau. Il est alors censé copier les valeurs du fichier. ancienne config à une nouvelle config. Si les deux valeurs sont identiques et que le numéro de version n'a pas changé, la nouvelle configuration se trouvera au même emplacement que l'ancienne et ne nécessitera rien. Documentation MSDN

ClickOnce est un peu différent, car il est plus basé sur le numéro de version de ClickOnce et le chemin de l'URL. Cependant, j'ai constaté que tant que vous continuez à "Publier" au même emplacement, la nouvelle version de l'application continue. utiliser la configuration existante. ( lien permettant à ClickOnce de gérer les mises à jour . )

Je sais aussi qu’il existe un moyen de fusionner manuellement les configurations lors de l’installation du msi à l’aide de scripts d’installation personnalisés, mais je ne me souviens pas des étapes à suivre pour le faire ... (voir ce lien pour savoir comment procéder avec un fichier web.config)

Autres conseils

Je voulais ajouter ce texte cité comme référence pour avoir ce problème à l'avenir. Vous pouvez apparemment demander à l'infrastructure ApplicationSettings de copier les paramètres d'une version précédente en appelant Mettre à niveau :

Properties.Settings.Value.Upgrade();

De la FAQ sur les paramètres du client , article de blog: ( archive )

  

Q: Pourquoi y a-t-il un numéro de version dans le chemin user.config? Si je déploie une nouvelle version de mon application, l’utilisateur ne perdra-t-il pas tous les paramètres enregistrés par la version précédente?

     

R: Il y a plusieurs raisons pour lesquelles le   Le chemin utilisateur.config est sensible à la version.

     

(1) Pour prendre en charge le déploiement côte à côte   de différentes versions d'un   application (vous pouvez le faire avec   Cliquez une fois, par exemple). Il est   possible pour une version différente du   application d'avoir différents paramètres   sauvé.

     

(2) Lorsque vous mettez à niveau un   application, la classe de paramètres peut   ont été modifiés et peuvent ne pas être   compatible avec ce qui est sauvegardé,   ce qui peut entraîner des problèmes.

     

Cependant, nous avons facilité la tâche   mettre à jour les paramètres d'un précédent   version de l'application au   dernier. Il suffit d'appeler    ApplicationSettingsBase.Upgrade () et   il va récupérer les paramètres de la   version précédente qui correspond à la   version actuelle de la classe et du magasin   les sortir dans la version actuelle de   fichier user.config. Vous avez aussi le   possibilité de remplacer ce comportement   soit dans votre classe de paramètres ou dans   votre implémentation fournisseur.

     

Q: D'accord, mais comment savoir quand   appeler la mise à niveau?

     

R: Bonne question. En un clic, quand   vous installez une nouvelle version de votre   application, ApplicationSettingsBase   va le détecter et automatiquement   mise à niveau des paramètres pour vous au point   les paramètres sont chargés. En non-clic   cas, il n'y a pas de mise à niveau automatique -   vous devez appeler vous-même la mise à niveau.   Voici une idée pour déterminer quand   appeler Upgrade:

     

Avoir un paramètre booléen appelé   CallUpgrade et lui donner une valeur par défaut   valeur de true. Quand votre application démarre   up, vous pouvez faire quelque chose comme:

if (Properties.Settings.Value.CallUpgrade)
{
   Properties.Settings.Value.Upgrade();
   Properties.Settings.Value.CallUpgrade = false;    
}
  

Cela garantira que Upgrade () est   appelé seulement la première fois le   l'application s'exécute après une nouvelle version   est déployé.

Je ne crois pas une seconde que cela puisse réellement fonctionner - Microsoft ne fournirait pas cette possibilité, mais la méthode est la même.

Le fichier user.config est stocké sur

c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>

<c:\Documents and Settings> est le répertoire de données de l'utilisateur, non itinérant (Paramètres locaux ci-dessus) ou itinérant.
<username> est le nom d'utilisateur.
<companyname> est la valeur CompanyNameAttribute, si disponible. Sinon, ignorez cet élément.
<appdomainname> est le AppDomain.CurrentDomain.FriendlyName. La valeur par défaut est généralement le nom de fichier .exe.
<eid> est l'URL, le StrongName ou le chemin d'accès, en fonction des preuves disponibles pour le hachage.
<hash> est un hachage SHA1 d'éléments de preuve provenant du domaine CurrentDomain, dans l'ordre de préférence suivant:
    1. StrongName
    2. URL:
Si aucun de ces éléments n'est disponible, utilisez le chemin d'accès .exe.
<version> correspond au paramètre AssemblyVersionAttribute de AssemblyInfo.

La description complète est ici http://msdn.microsoft.com/en-us/library /ms379611.aspx

(J'ajouterais ceci comme commentaire à la réponse de @Amr, mais je n'ai pas assez de représentant pour le faire pour le moment.)

Les informations contenues dans l'article MSDN sont très claires et semblent toujours appliquer. Cependant, il est omis de mentionner que le hachage SHA1 est écrit en base 32, plutôt qu’en base 16.

Je pense que l'algorithme utilisé est implémenté dans ToBase32StringSuitableForDirName, qui peuvent être trouvés ici dans la source de référence Microsoft .

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