Ось що я виявив, що працював над тим, щоб отримати можливість розгорнутого місця розташування папки мого додатка для натискання, і це не було зазначено ніде, що я бачив у своїх пошуках, для мого аналогічного конкретного сценарію:
- Додаток clickkonce розгорнуто у мережевій папці локальної мережі компанії.
- Додаток "Clickkonce" встановлено таким чином, щоб він був доступний в Інтернеті чи офлайн.
- У моїй установочній URL-адресі за допомогою кліку та в URL-адресах оновлення у властивостях мого проекту нічого не вказано. Тобто немає окремого місця для встановлення чи оновлення.
- У своїх варіантах публікації у мене є ярлик на робочому столі, створений для програми clickkonce.
- Папка, до якої я хочу отримати шлях при запуску, - це та, до якої я хочу отримати доступ до версій програми DEV, INT та PROD без жорсткого кодування шляху.
Ось наочний випадок мого використання:
- Папки із синім кольором - це мій каталог каталогів для кожної програми.
- Папка з червоною коробкою - це каталог, до якого я хочу пройти шлях (для якого потрібно спочатку отримати місце розгорнутої програми в папці "MyClickOnceGreatApp_1_0_0_37", що таке саме, як і ОП).
Я не знайшов жодної із пропозицій у цьому запитанні чи їх коментарів, які б спрацювали над поверненням папки, в яку було розгорнуто додаток clickkonce (що я потім переміщу відносно цієї папки, щоб знайти цікаву папку). Жоден інший пошук в Інтернеті або пов'язані з цим питання запитання також не знайшли відповіді.
Усі запропоновані властивості або були відмовлені через те, що об’єкт (наприклад, ActivationUri) є недійсним, або вказували на кешовану папку встановленого додатка місцевого ПК. Так, я міг вишукано обробити нульові об’єкти, перевіривши IsNetworkDeployed - це не проблема - але дивно, IsNetworkDeployed повертає помилкові дані, хоча у мене фактично є розгорнуте мережеве розташування папок для програми clickkonce. Це тому, що програма працює з локальних, кешованих бітів.
Рішення полягає в тому, щоб переглянути:
AppDomain.CurrentDomain.BaseDirectory
коли програма запускається у візуальній студії в міру розвитку і
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
коли воно виконується нормально.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
правильно повертає мережевий каталог, в який розгорнуто мою програму clickkonce, у всіх випадках. Тобто, коли він запускається через:
- setup.exe
- MyClickOnceGreatApp.application
- Ярлик на робочому столі, створений після першого встановлення та запуску програми.
Ось код, який я використовую при запуску програми, щоб отримати шлях до папки WorkAccounts. Отримати розгорнуту папку додатків просто, просто не рухаючись до батьківських каталогів:
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();
}
}