Aqui está o que eu achei que funcionava para conseguir o local da pasta implantada do meu aplicativo clickonce e que não havia sido mencionado em nenhum lugar que eu vi nas minhas pesquisas, no meu cenário específico semelhante:
- O aplicativo clickonce é implantado em uma pasta de rede LAN da empresa.
- O aplicativo clickonce está definido para estar disponível online ou offline.
- Meu URL de instalação clickonce e URLs de atualização nas propriedades do meu projeto não possuem nada especificado. Ou seja, não há um local separado para instalação ou atualizações.
- Nas minhas opções de publicação, estou tendo um atalho na área de trabalho criado para o aplicativo clickonce.
- A pasta para a qual desejo obter o caminho na inicialização é aquela em que quero ser acessada pelas versões DEV, INT e PROD do aplicativo, sem codificar o caminho.
Aqui está um visual do meu caso de uso:
- As pastas em caixas azuis são meus locais de diretório para cada aplicativo do ambiente.
- A pasta em caixa vermelha é o diretório para o qual desejo obter o caminho (o que exige primeiro obter o local da pasta implantada do aplicativo "MyClickOnceGreatApp_1_0_0_37", que é igual ao OP).
Não encontrei nenhuma das sugestões nesta pergunta ou seus comentários para retornar a pasta na qual o aplicativo clickonce foi implantado (que eu passaria em relação a essa pasta para encontrar a pasta de seu interesse). Nenhuma outra pesquisa na Internet ou perguntas relacionadas ao SO apresentaram uma resposta também.
Todas as propriedades sugeridas estavam com falha devido ao objeto (por exemplo, ActivationUri) ser nulo ou estavam apontando para a pasta do aplicativo instalado em cache do PC local. Sim, eu poderia lidar com objetos nulos com facilidade, verificando IsNetworkDeployed - isso não é um problema -, mas surpreendentemente IsNetworkDeployed retorna false, mesmo que eu tenha, de fato, um local de pasta implantado em rede para o aplicativo clickonce. Isso ocorre porque o aplicativo está sendo executado nos bits em cache locais.
A solução é olhar para:
AppDomain.CurrentDomain.BaseDirectory
quando o aplicativo está sendo executado no visual studio à medida que desenvolvo e
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
quando está executando normalmente.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
retorna corretamente o diretório de rede em que meu aplicativo clickonce está implantado, em todos os casos. Ou seja, quando é lançado via:
- setup.exe
- MyClickOnceGreatApp.application
- O atalho da área de trabalho criado após a primeira instalação e inicialização do aplicativo.
Aqui está o código que eu uso na inicialização do aplicativo para obter o caminho da pasta WorkAccounts. Obter a pasta do aplicativo implantado é simples, apenas não marcando para os diretórios pai:
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();
}
}