visual studio publicar one net instalador hacer forzar form ejecutable crear como aplicaciones aplicacion actualizar actualizacion c# visual-studio versioning

c# - studio - forzar actualizacion clickonce



Actualizar automáticamente el número de versión (7)

¿Qué sistema de control de fuente estás usando?

Casi todos tienen alguna forma de etiqueta $ Id $ que se expande cuando se registra el archivo.

Usualmente uso alguna forma de piratería para mostrar esto como el número de versión.

La otra alternativa es usar la fecha como el número de compilación: 080803-1448

Me gustaría que la propiedad de versión de mi aplicación se incremente para cada compilación, pero no estoy seguro de cómo habilitar esta funcionalidad en Visual Studio (2005/2008). He tratado de especificar la versión de la Asamblea como 1.0. * Pero no me da exactamente lo que quiero.

También estoy usando un archivo de configuración y en intentos anteriores cuando la versión de ensamblaje cambió mi configuración se restableció a la predeterminada, ya que la aplicación buscó el archivo de configuración en otro directorio.

Me gustaría poder mostrar un número de versión en forma de 1.1.38 para que cuando un usuario encuentre un problema pueda registrar la versión que está usando y decirle que actualice si tiene una versión anterior.

También se agradecería una breve explicación de cómo funciona el control de versiones. ¿Cuándo se incrementa el número de compilación y revisión?


Con el material "incorporado", no puede, ya que el uso de 1.0. * O 1.0.0. * Reemplazará los números de revisión y compilación con una fecha / hora codificada, que generalmente también es una buena manera.

Para obtener más información, consulte la documentación del vinculador de ensamblaje en la etiqueta / v.

En cuanto a los números que se incrementan automáticamente, use la tarea AssemblyInfo:

AssemblyInfo Task

Esto se puede configurar para incrementar automáticamente el número de compilación.

Hay 2 Gotchas:

  1. Cada uno de los 4 números en la cadena de Versión está limitado a 65535. Esta es una limitación de Windows y es poco probable que se solucione.
  2. Usar con Subversion requiere un pequeño cambio:

Recuperar el número de versión es bastante fácil:

Version v = Assembly.GetExecutingAssembly().GetName().Version; string About = string.Format(CultureInfo.InvariantCulture, @"YourApp Version {0}.{1}.{2} (r{3})", v.Major, v.Minor, v.Build, v.Revision);

Y, para aclarar: en .net o al menos en C #, la compilación es en realidad el TERCER número, no el cuarto como algunas personas (por ejemplo, Desarrolladores de Delphi que están acostumbrados a Major.Minor.Release.Build) podrían esperar.

En .net, es Major.Minor.Build.Revision.


Descubrí que funciona bien simplemente mostrar la fecha de la última compilación utilizando lo siguiente siempre que se necesite una versión del producto:

System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy.MM.dd.HH.mm.ss")

En lugar de intentar obtener la versión de algo como lo siguiente:

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); object[] attributes = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false); object attribute = null; if (attributes.Length > 0) { attribute = attributes[0] as System.Reflection.AssemblyFileVersionAttribute; }


Hace algún tiempo escribí un exe rápido y sucio que actualizaría los números de versión en una información de ensamblaje. {Cs / vb} - También he usado rxfind.exe (una herramienta simple y poderosa de reemplazo de búsqueda basada en expresiones regulares) para hacer el actualizar desde una línea de comando como parte del proceso de compilación. Un par de otras sugerencias de ayuda:

  1. separe la información del ensamblaje en partes del producto (nombre de la compañía, versión, etc.) y partes específicas del ensamblaje (nombre del ensamblaje, etc.). Ver here
  2. Además, utilizo Subversion, por lo que me pareció útil establecer el número de compilación en el número de revisión de Subversion, lo que hace que sea realmente fácil volver siempre a la base de código que generó el ensamblado (por ejemplo, 1.4.100.1502 se creó a partir de la revisión 1502).

Si desea un número de incremento automático que se actualice cada vez que se realiza una compilación, puede usar VersionUpdater desde un evento previo a la compilación. Su evento previo a la compilación puede verificar la configuración de la compilación si lo prefiere para que el número de versión solo se incremente para una compilación de lanzamiento (por ejemplo).


VS.NET predetermina la versión de ensamblado a 1.0. * Y utiliza la siguiente lógica cuando se incrementa automáticamente: establece la parte de compilación en la cantidad de días desde el 1 de enero de 2000 y establece la parte de revisión en la cantidad de segundos desde la medianoche, hora local, dividida por dos. Ver este artículo de MSDN .

La versión de ensamblaje se encuentra en un archivo assemblyinfo.vb o assemblyinfo.cs. Del archivo:

'' Version information for an assembly consists of the following four values: '' '' Major Version '' Minor Version '' Build Number '' Revision '' '' You can specify all the values or you can default the Build and Revision Numbers '' by using the ''*'' as shown below: '' <Assembly: AssemblyVersion("1.0.*")> <Assembly: AssemblyVersion("1.0.0.0")> <Assembly: AssemblyFileVersion("1.0.0.0")>


[Visual Studio 2017, propiedades .csproj ]

Para actualizar automáticamente su propiedad PackageVersion / Version / AssemblyVersion (o cualquier otra propiedad), primero, cree una nueva clase Microsoft.Build.Utilities.Task que obtenga su número de compilación actual y envíe el número actualizado (recomiendo crear un separado proyecto solo para esa clase).

Actualizo manualmente los números major.minor, pero dejo que MSBuild actualice automáticamente el número de compilación (1.1. 1 , 1.1. 2 , 1.1. 3 , etc.)

using Microsoft.Build.Framework; using System; using System.Collections.Generic; using System.Text; public class RefreshVersion : Microsoft.Build.Utilities.Task { [Output] public string NewVersionString { get; set; } public string CurrentVersionString { get; set; } public override bool Execute() { Version currentVersion = new Version(CurrentVersionString ?? "1.0.0"); DateTime d = DateTime.Now; NewVersionString = new Version(currentVersion.Major, currentVersion.Minor, currentVersion.Build+1).ToString(); return true; } }

Luego llame a su tarea recientemente creada en el proceso MSBuild agregando el siguiente código en su archivo .csproj:

<Project Sdk="Microsoft.NET.Sdk"> ... <UsingTask TaskName="RefreshVersion" AssemblyFile="$(MSBuildThisFileFullPath)/../../<dll path>/BuildTasks.dll" /> <Target Name="RefreshVersionBuildTask" BeforeTargets="Pack" Condition="''$(Configuration)|$(Platform)''==''Release|AnyCPU''"> <RefreshVersion CurrentVersionString="$(PackageVersion)"> <Output TaskParameter="NewVersionString" PropertyName="NewVersionString" /> </RefreshVersion> <Message Text="Updating package version number to $(NewVersionString)..." Importance="high" /> <XmlPoke XmlInputPath="$(MSBuildProjectDirectory)/mustache.website.sdk.dotNET.csproj" Query="/Project/PropertyGroup/PackageVersion" Value="$(NewVersionString)" /> </Target> ... <PropertyGroup> .. <PackageVersion>1.1.4</PackageVersion> ..

Al elegir la opción de proyecto Visual Studio Pack (simplemente cambie a BeforeTargets="Build" para ejecutar la tarea antes de Build), el código RefreshVersion se activará para calcular el nuevo número de versión, y la tarea XmlPoke actualizará su propiedad .csproj en consecuencia (sí, se modificará el archivo).

Cuando trabajo con las bibliotecas de NuGet, también envío el paquete al repositorio de NuGet simplemente agregando la siguiente tarea de compilación al ejemplo anterior.

<Message Text="Uploading package to NuGet..." Importance="high" /> <Exec WorkingDirectory="$(MSBuildProjectDirectory)/bin/release" Command="c:/nuget/nuget push *.nupkg -Source https://www.nuget.org/api/v2/package" IgnoreExitCode="true" />

c:/nuget/nuget es donde tengo el cliente NuGet (recuerde guardar su clave API nuget SetApiKey <my-api-key> llamando a nuget SetApiKey <my-api-key> o para incluir la clave en la llamada push de NuGet).

Por si acaso ayuda a alguien ^ _ ^.