Voici ce que j'ai trouvé qui a fonctionné pour pouvoir obtenir l'emplacement du dossier déployé de mon application clickonce et qui n'a été mentionné nulle part dans mes recherches, pour mon scénario similaire et spécifique:
- L'application clickonce est déployée dans un dossier réseau LAN d'entreprise.
- L'application clickonce est définie pour être disponible en ligne ou hors ligne.
- L'URL d'installation ClickOne et les URL de mise à jour dans les propriétés de mon projet n'ont rien de spécifié. Autrement dit, il n'y a pas d'emplacement séparé pour l'installation ou les mises à jour.
- Dans mes options de publication, j'ai créé un raccourci sur le bureau pour l'application ClickOne.
- Le dossier dont je souhaite obtenir le chemin au démarrage est celui auquel je souhaite accéder par les versions DEV, INT et PROD de l'application, sans codage en dur du chemin.
Voici un visuel de mon cas d'utilisation:
- Les dossiers encadrés bleus sont mes emplacements de répertoire pour l'application de chaque environnement.
- Le dossier encadré rouge est le répertoire pour lequel je veux obtenir le chemin (ce qui nécessite d'abord d'obtenir l'emplacement du dossier déployé de l'application "MyClickOnceGreatApp_1_0_0_37" qui est le même que l'OP).
Je n'ai trouvé aucune des suggestions de cette question ou de leurs commentaires pour retourner le dossier dans lequel l'application clickonce a été déployée (que je déplacerais ensuite par rapport à ce dossier pour trouver le dossier d'intérêt). Aucune autre recherche sur Internet ni aucune question relative à l'OS n'a donné de réponse.
Toutes les propriétés suggérées échouaient en raison de la nullité de l'objet (par exemple ActivationUri) ou pointaient vers le dossier d'application installée en cache du PC local. Oui, je pourrais gérer gracieusement les objets nuls en vérifiant IsNetworkDeployed - ce n'est pas un problème - mais, étonnamment, IsNetworkDeployed renvoie false même si j'ai en fait un emplacement de dossier déployé sur le réseau pour l'application clickonce. En effet, l'application s'exécute à partir des bits locaux mis en cache.
La solution est de regarder:
AppDomain.CurrentDomain.BaseDirectory
lorsque l'application est exécutée dans Visual Studio pendant que je développe et
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
lorsqu'il s'exécute normalement.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
renvoie correctement le répertoire réseau dans lequel mon application clickonce est déployée, dans tous les cas. Autrement dit, lorsqu'il est lancé via:
- setup.exe
- MyClickOnceGreatApp.application
- Le raccourci sur le bureau créé lors de la première installation et du premier lancement de l'application.
Voici le code que j'utilise au démarrage de l'application pour obtenir le chemin du dossier WorkAccounts. Obtenir le dossier d'application déployé est simple en ne se dirigeant pas vers les répertoires parents:
string directoryOfInterest = "";
if (System.Diagnostics.Debugger.IsAttached)
{
directoryOfInterest = Directory.GetParent(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName).FullName;
}
else
{
try
{
string path = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
path = path.Replace("file:", "");
path = path.Replace("/", "\\");
directoryOfInterest = Directory.GetParent(Directory.GetParent(path).FullName).FullName;
}
catch (Exception ex)
{
directoryOfInterest = "Error getting update directory needed for relative base for finding WorkAccounts directory.\n" + ex.Message + "\n\nUpdate location directory is: " + System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
}
}