Вот что я обнаружил, и это помогло мне найти расположение развернутой папки моего приложения clickonce, и это нигде не было упомянуто в моих поисках для моего похожего специфического сценария:
- Приложение clickonce развертывается в сетевой папке локальной сети компании.
- Приложение clickonce доступно для работы в Интернете или в автономном режиме.
- Мои URL-адреса установки clickonce и URL-адреса обновлений в свойствах моего проекта не указаны. То есть отдельного места для установки или обновления не существует.
- В моих опциях публикации у меня есть ярлык на рабочем столе, созданный для приложения clickonce.
- Папка, для которой я хочу получить путь при запуске, является папкой, к которой я хочу получить доступ в версиях приложения DEV, INT и PROD, без жесткого указания пути.
Вот изображение моего варианта использования:
- Папки в синей коробке - это мои каталоги для каждого
применение среды.
- Красная коробочная папка - это каталог, для которого я хочу получить путь
(для этого необходимо сначала получить местоположение развернутой папки приложения
«MyClickOnceGreatApp_1_0_0_37», который совпадает с OP).
Я не нашел ни одного из предложений в этом вопросе или их комментариев для работы по возвращению папки, в которой было развернуто приложение clickonce (которую я затем переместил бы относительно этой папки, чтобы найти интересующую папку). Ни один другой поиск в Интернете или связанные с ним вопросы SO тоже не нашли ответа.
Все предложенные свойства либо не работали из-за того, что объект (например, ActivationUri) был нулевым, либо указывали на кешированную папку установленного приложения на локальном ПК. Да, я мог бы изящно обрабатывать нулевые объекты с помощью проверки IsNetworkDeployed - это не проблема - но удивительно, что IsNetworkDeployed возвращает false, даже если у меня действительно есть расположение развернутой в сети папки для приложения clickonce. Это связано с тем, что приложение запускается из локальных кэшированных битов.
Решение состоит в том, чтобы посмотреть:
AppDomain.CurrentDomain.BaseDirectory
когда приложение запускается в Visual Studio во время разработки и
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
при нормальном выполнении.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
правильно возвращает сетевой каталог, в котором развернуто мое приложение clickonce, во всех случаях. То есть когда он запускается через:
- 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();
}
}