c# - studio - publicar aplicacion windows forms
Cómo mostrar el número de versión de ClickOnce en Windows Forms (9)
Tengo una aplicación de formularios de Windows que se implementa en dos ubicaciones diferentes.
- Intranet - ClickOnce
- Internet: instalado en una granja de cítricos a través del instalador de Windows
Despliego el número de versión de ClickOnce para la versión implementada por clic una sola vez ApplicationDeployment.IsNetworkDeployed
.
if (ApplicationDeployment.IsNetworkDeployed)
return ApplicationDeployment.CurrentDeployment.CurrentVersion;
Pero para la aplicación sin clic, no estoy seguro de cómo recuperar la versión de clic, a menos que codifique el número de versión en la información de ensamblaje.
¿Existe una forma automática de recuperar el número de versión de ClickOnce para la versión desplegada sin clic?
Agregue una referencia de ensamblado a
System.Deployment
a su proyecto.Importe el espacio de nombres en su archivo de clase:
VB.NET:
Imports System.Deployment
DO#:
using System.Deployment;
Recupere la versión ClickOnce de la propiedad
CurrentVersion
.Puede obtener la versión actual desde la propiedad
ApplicationDeployment.CurrentDeployment.CurrentVersion
. Esto devuelve un objetoSystem.Version
.Nota (desde MSDN):
CurrentVersion
diferirá de laUpdatedVersion
actualizada si se ha instalado una nueva actualización pero todavía no se ha llamado aRestart
. Si el manifiesto de implementación está configurado para realizar actualizaciones automáticas, puede comparar estos dos valores para determinar si debe reiniciar la aplicación.NOTA: la propiedad estática
CurrentDeployment
solo es válida cuando la aplicación se ha implementado con ClickOnce. Por lo tanto, antes de acceder a esta propiedad, primero debe verificar la propiedadApplicationDeployment.IsNetworkDeployed
. Siempre devolverá un falso en el entorno de depuración.VB.NET:
Dim myVersion as Version If ApplicationDeployment.IsNetworkDeployed Then myVersion = ApplicationDeployment.CurrentDeployment.CurrentVersion End If
DO#:
Version myVersion; if (ApplicationDeployment.IsNetworkDeployed) myVersion = ApplicationDeployment.CurrentDeployment.CurrentVersion;
Use el objeto
Version
:A partir de ahora, puede usar la información de la versión en una etiqueta, por ejemplo, en un formulario "Acerca de", de esta manera:
VB.NET:
versionLabel.Text = String.Concat("ClickOnce published Version: v", myVersion)
DO#:
versionLabel.Text = string.Concat("ClickOnce published Version: v", myVersion);
(Los objetos de
Version
tienen el formato de un número de cuatro partes (major.minor.build.revision)).
Al usar un componente de compilación, puede leer la versión de un clic del archivo del proyecto y escribirla automáticamente en la información del conjunto para que ambos estén sincronizados.
Código difícil, o ... Mantenga un registro de sus versiones (Archivo, Ensamblaje, Implementación) en una base de datos. Realice una llamada a la base de datos con su Asamblea y obtenga la versión de Implementación.
Esto supone que está incrementando sus versiones de una manera lógica, de modo que cada tipo de versión tenga una relación. Es mucho trabajo para un problema menor. Yo personalmente iría con la solución de Jared; aunque odio codificar todo.
Haz una verificación de hilo, inserta código endurecido ...
No, no creo que haya una manera. Creo que la información de ClickOnce proviene del manifiesto que solo estará disponible en una implementación de ClickOnce. Creo que codificar el número de versión es tu mejor opción.
Para ampliar la solución de RobinDotNet:
Protip: puede ejecutar automáticamente un programa o script para hacer esto por usted desde el archivo .csproj de la configuración de MSBuild cada vez que compile. Hice esto para una aplicación web que actualmente mantengo, ejecutando un script de shell bash de Cygwin para hacer algún control de versión h4x para calcular un número de versión del historial de Git, luego preprocesamos el archivo fuente de información de ensamblado compilado en el resultado de compilación.
Algo similar podría hacerse para analizar el número de versión de ClickOnce del archivo de proyecto, es decir, Project.PropertyGroup.ApplicationRevision
y Project.PropertyGroup.ApplicationVersion
(aunque no sé qué significa la cadena de versión, pero puede adivinar hasta que se rompe y lo arregla luego) e inserta esa información de versión en la información de ensamblaje.
No sé cuándo se golpea la versión de ClickOnce, pero probablemente después del proceso de compilación, por lo que es posible que tenga que manipular esta solución para obtener el nuevo número compilado. Supongo que siempre hay /*h4x*/ +1
.
Utilicé Cygwin porque * nix scripting es mucho mejor que Windows y el código interpretado le ahorra la molestia de construir su programa preconstruido antes de compilarlo , pero puede escribir el programa usando la tecnología que desee (incluido C # / .NET). La línea de comando para el pre-procesador va dentro del PreBuildEvent
:
<PropertyGroup>
<PreBuildEvent>
$(CYGWIN_ROOT)bin/bash.exe --login -c refresh-version
</PreBuildEvent>
</PropertyGroup>
Como se imaginaría, esto sucede antes de la etapa de compilación, por lo que puede preprocesar su código fuente antes de compilarlo. No quería editar automáticamente el archivo Properties/AssemblyInfo.cs
, así que, para ir a lo seguro, lo que hice fue crear un archivo Properties/VersionInfo.base.cs
que contuviera una plantilla de texto de una clase con la información de la versión y se marcó como BuildAction=None
en la configuración del proyecto para que no se haya compilado con el proyecto:
using System.Reflection;
using EngiCan.Common.Properties;
[assembly: AssemblyVersion("0.$REVNUM_DIV(100)$.$REVNUM_MOD(100)$.$DIRTY$")]
[assembly: AssemblyRevisionIdentifier("$REVID$")]
(Se usó una sintaxis de marcador de posición muy sucia y pobre que se asemeja a las variables de entorno de Windows con algo de h4x adicional, por simplicidad / complejidad)
AssemblyRevisionIdentifierAttribute
fue un atributo personalizado que creé para mantener el Git SHA1, ya que es mucho más significativo para los desarrolladores que abcd .
Mi programa de refresh-version
luego copiaba ese archivo a Properties/VersionInfo.cs
, y luego hacía la sustitución de la información de la versión que ya había calculado / analizado (utilicé sed(1)
para la sustitución, que era otro beneficio de usar Cygwin ) Properties/VersionInfo.cs
se compiló en el programa. Ese archivo puede comenzar vacío y usted debe ignorarlo por su sistema de control de versiones porque está cambiando automáticamente y la información para generarlo ya está almacenada en otro lugar.
Prueba la verificación de hilo:
if (ApplicationDeployment.IsNetworkDeployed)
{
if (ApplicationDeployment.CurrentDeployment.CurrentVersion != ApplicationDeployment.CurrentDeployment.UpdatedVersion)
{
Application.ExitThread();
Application.Restart();
}
}
Simplemente haría que la versión de ensamblaje del ensamblaje principal sea igual que la versión de CLICKOnce cada vez que ejecute una nueva versión. Luego, cuando se ejecuta como una aplicación sin clic, simplemente use Reflection para seleccionar la versión de ensamblaje.
no es que importe tres años después, pero terminé simplemente analizando el archivo manifiesto con xml reader.