Вот что я обнаружил, и это помогло мне найти расположение развернутой папки моего приложения clickonce, и это нигде не было упомянуто в моих поисках для моего похожего специфического сценария:
- Приложение clickonce развернуто в сетевой папке компании.
- Приложение clickonce должно быть доступно онлайн или офлайн.
- Мои URL-адреса установки clickonce и URL-адреса обновлений в свойствах моего проекта не указаны. То есть нет отдельного места для установки или обновления.
- В моих опциях публикации у меня есть ярлык на рабочем столе, созданный для приложения clickonce.
- Папка, для которой я хочу получить путь при запуске, является папкой, к которой я хочу получить доступ в версиях приложения DEV, INT и PROD, без жесткого определения пути.
Вот изображение моего варианта использования:
- Папки в синей рамке - это мои каталоги для каждого приложения среды.
- Красная папка в штучной упаковке - это каталог, для которого я хочу получить путь (для этого необходимо сначала получить местоположение развернутой папки приложения «MyClickOnceGreatApp_1_0_0_37», которое совпадает с OP).
Я не нашел ни одного из предложений в этом вопросе или их комментариев для работы по возвращению папки, в которой было развернуто приложение clickonce (которую я затем переместил бы относительно этой папки, чтобы найти интересующую папку). Никакой другой интернет-поиск или связанные с этим вопросы так же не нашли ответа.
Все предложенные свойства либо не работали из-за того, что объект (например, 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();
}
}