Oto, co znalazłem, co zadziałało, aby uzyskać lokalizację wdrożonego folderu mojej aplikacji Clickonce i nie zostało nigdzie wspomniane w moich wyszukiwaniach, dla mojego podobnego, konkretnego scenariusza:
- Aplikacja Clickonce jest wdrażana w firmowym folderze sieci LAN.
- Aplikacja Clickonce jest ustawiona jako dostępna online lub offline.
- Mój adres URL instalacji Clickonce i adresy URL aktualizacji we właściwościach projektu nie mają nic określonego. Oznacza to, że nie ma oddzielnej lokalizacji do instalacji lub aktualizacji.
- W moich opcjach publikowania mam utworzony skrót na pulpicie dla aplikacji Clickonce.
- Folder, do którego chcę uzyskać ścieżkę podczas uruchamiania, to folder, do którego chcę mieć dostęp w wersjach DEV, INT i PROD aplikacji, bez zakodowania ścieżki na stałe.
Oto wizualizacja mojego przypadku użycia:
- Foldery w niebieskich ramkach to moje lokalizacje katalogów dla aplikacji każdego środowiska.
- Folder w czerwonym polu to katalog, do którego chcę uzyskać ścieżkę (co wymaga najpierw pobrania lokalizacji folderu wdrożonego aplikacji „MyClickOnceGreatApp_1_0_0_37”, która jest taka sama jak OP).
Nie znalazłem żadnych sugestii w tym pytaniu ani ich komentarzy do pracy przy zwracaniu folderu, w którym wdrożono aplikację Clickonce (do którego następnie przenosiłbym się względem tego folderu, aby znaleźć interesujący folder). Żadne inne wyszukiwanie w Internecie ani powiązane pytania SO również nie przyniosły odpowiedzi.
Wszystkie sugerowane właściwości albo kończyły się niepowodzeniem, ponieważ obiekt (np. ActivationUri) był pusty, albo wskazywały na folder zainstalowanej aplikacji w pamięci podręcznej lokalnego komputera. Tak, mogłem z wdziękiem obsługiwać obiekty zerowe, sprawdzając IsNetworkDeployed - to nie jest problem - ale, co zaskakujące, IsNetworkDeployed zwraca wartość false, mimo że w rzeczywistości mam lokalizację folderu wdrożonego w sieci dla aplikacji Clickonce. Dzieje się tak, ponieważ aplikacja jest uruchamiana z lokalnych, zbuforowanych bitów.
Rozwiązaniem jest przyjrzenie się:
AppDomain.CurrentDomain.BaseDirectory
gdy aplikacja jest uruchamiana w Visual Studio w miarę rozwoju i
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
gdy wykonuje się normalnie.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
we wszystkich przypadkach poprawnie zwraca katalog sieciowy, w którym moja aplikacja Clickonce jest wdrożona. To znaczy, gdy jest uruchamiany przez:
- setup.exe
- MyClickOnceGreatApp.application
- Skrót na pulpicie tworzony przy pierwszej instalacji i uruchomieniu aplikacji.
Oto kod, którego używam podczas uruchamiania aplikacji, aby uzyskać ścieżkę do folderu WorkAccounts. Uzyskanie folderu wdrożonej aplikacji jest proste, ponieważ nie prowadzi się do katalogów nadrzędnych:
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();
}
}