Ecco cosa ho scoperto che ha funzionato per essere in grado di ottenere il percorso della cartella distribuita della mia applicazione clickonce e che non è stato menzionato da nessuna parte che ho visto nelle mie ricerche, per il mio scenario simile e specifico:
- L'applicazione clickonce viene distribuita in una cartella di rete LAN aziendale.
- L'applicazione clickonce è impostata per essere disponibile online o offline.
- L'URL di installazione di Clickonce e gli URL di aggiornamento nelle proprietà del mio progetto non hanno specificato nulla. Cioè, non esiste un percorso separato per l'installazione o gli aggiornamenti.
- Nelle mie opzioni di pubblicazione, sto avendo un collegamento sul desktop creato per l'applicazione clickonce.
- La cartella per cui voglio ottenere il percorso all'avvio è quella a cui voglio accedere dalle versioni DEV, INT e PROD dell'applicazione, senza codificare il percorso.
Ecco un'immagine del mio caso d'uso:
- Le cartelle blue box sono le posizioni delle mie directory per ciascuna applicazione di ambiente.
- La cartella in scatola rossa è la directory per cui voglio ottenere il percorso (che richiede innanzitutto ottenere la posizione della cartella distribuita dell'app "MyClickOnceGreatApp_1_0_0_37" che è la stessa dell'OP).
Non ho trovato alcun suggerimento in questa domanda o i loro commenti per funzionare nel restituire la cartella in cui è stata distribuita l'applicazione clickonce (che poi vorrei spostare rispetto a questa cartella per trovare la cartella di interesse). Nemmeno altre ricerche su Internet o relative domande SO hanno dato una risposta.
Tutte le proprietà suggerite non funzionavano perché l'oggetto (ad esempio ActivationUri) era nullo o puntavano alla cartella dell'app installata nella cache del PC locale. Sì, ho potuto gestire con grazia oggetti null controllando IsNetworkDeployed - questo non è un problema - ma sorprendentemente IsNetworkDeployed restituisce false anche se in realtà ho una posizione di cartella distribuita in rete per l'applicazione clickonce. Questo perché l'applicazione è in esecuzione dai bit locali memorizzati nella cache.
La soluzione è guardare a:
AppDomain.CurrentDomain.BaseDirectory
quando l'applicazione viene eseguita in Visual Studio mentre sviluppo e
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
quando si sta eseguendo normalmente.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
restituisce correttamente la directory di rete in cui è distribuita la mia applicazione clickonce, in tutti i casi. Cioè, quando viene lanciato tramite:
- setup.exe
- MyClickOnceGreatApp.application
- Il collegamento sul desktop creato alla prima installazione e avvio dell'applicazione.
Ecco il codice che utilizzo all'avvio dell'applicazione per ottenere il percorso della cartella WorkAccounts. Ottenere la cartella dell'applicazione distribuita è semplice semplicemente non marciando sulle directory principali:
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();
}
}