Esto es lo que encontré que funcionó para poder obtener la ubicación de la carpeta desplegada de mi aplicación clickonce y que no se ha mencionado en ningún lugar que vi en mis búsquedas, para mi escenario similar y específico:
- La aplicación clickonce se implementa en una carpeta de red LAN de la empresa.
- La aplicación clickonce está configurada para estar disponible en línea o fuera de línea.
- Mi URL de instalación de clickonce y las URL de actualización en las propiedades de mi proyecto no tienen nada especificado. Es decir, no hay una ubicación separada para la instalación o las actualizaciones.
- En mis opciones de publicación, tengo un acceso directo de escritorio creado para la aplicación clickonce.
- La carpeta para la que quiero obtener la ruta al inicio es aquella a la que quiero que accedan las versiones DEV, INT y PROD de la aplicación, sin codificar la ruta.
Aquí hay una imagen de mi caso de uso:
- Las carpetas en recuadro azul son mis ubicaciones de directorio para la aplicación de cada entorno.
- La carpeta en recuadro rojo es el directorio para el que quiero obtener la ruta (que requiere primero obtener la ubicación de la carpeta desplegada de la aplicación "MyClickOnceGreatApp_1_0_0_37", que es lo mismo que el OP).
No encontré ninguna de las sugerencias en esta pregunta o sus comentarios para trabajar en la devolución de la carpeta en la que se implementó la aplicación clickonce (que luego movería en relación con esta carpeta para encontrar la carpeta de interés). Ninguna otra búsqueda en Internet o preguntas relacionadas con SO tampoco dieron una respuesta.
Todas las propiedades sugeridas fallaban debido a que el objeto (por ejemplo, ActivationUri) era nulo o apuntaban a la carpeta de la aplicación instalada en caché de la PC local. Sí, podría manejar con gracia los objetos nulos mediante una comprobación de IsNetworkDeployed, eso no es un problema, pero sorprendentemente IsNetworkDeployed devuelve falso aunque de hecho tengo una ubicación de carpeta desplegada en la red para la aplicación clickonce. Esto se debe a que la aplicación se ejecuta desde los bits locales en caché.
La solución es mirar:
AppDomain.CurrentDomain.BaseDirectory
cuando la aplicación se ejecuta en Visual Studio a medida que desarrollo y
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
cuando se ejecuta normalmente.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
devuelve correctamente el directorio de red en el que se implementa mi aplicación clickonce, en todos los casos. Es decir, cuando se inicia a través de:
- setup.exe
- MyClickOnceGreatApp.application
- El acceso directo de escritorio creado en la primera instalación e inicio de la aplicación.
Aquí está el código que uso al iniciar la aplicación para obtener la ruta de la carpeta WorkAccounts. Obtener la carpeta de la aplicación implementada es simple simplemente no avanzando hacia los directorios principales:
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();
}
}