una publicidad programas programa plataformas para moviles mobincube gratis desde descargar crear como cero app aplicaciones aplicacion .net clickonce singleinstance

.net - publicidad - ¿Cómo puedo crear una aplicación de instancia única con Click Once?



programa para crear aplicaciones android (4)

Necesito tener una aplicación de instancia única (según esta respuesta ), pero debe implementarse haciendo clic una vez.

El problema es que requiero que hacer clic una vez no detecte automáticamente una actualización e intente cargar una versión más nueva mientras la aplicación se está ejecutando. Si se está ejecutando, entonces necesito que la otra instancia se active. Por lo general, al seleccionar un enlace Hacer clic una vez, lo primero que hace es intentar encontrar una actualización. Quiero interceptar esto y comprobar si hay una instancia en ejecución antes de iniciar el proceso de actualización normal.

¿Alguien sabe cómo esto es posible dentro de un escenario de implementación de Hacer clic una vez?


Claro : puede deshabilitar la comprobación automática de la actualización de ClickOnce (en el cuadro de diálogo Publicar -> Actualizaciones ...), luego use los objetos y comandos en el espacio de nombres System.Deployment.Application para buscar actualizaciones pragmáticamente.

Revisa:

Si hay una actualización, puede hacer las comprobaciones de su aplicación de instancia única antes de actualizar realmente, llamando a:


No creo que puedas hacerlo así porque el cheque antes de ejecutar está fuera de tu código.

Sin embargo, puede cambiar las opciones de implementación de clickonce para buscar actualizaciones durante la ejecución del código.

Si necesita más control, puede utilizar los métodos ApplicationDeployment Update o CheckForUpdate para tener absoluto sobre el proceso de actualización.


Para abordar el problema, creamos una aplicación prototipo que tiene las siguientes dos funcionalidades.

  1. Múltiples instancias en una pc están deshabilitadas. Una aplicación de instancia única se implementa mediante clickonce. Cuando un usuario intenta iniciar una segunda instancia de la aplicación, aparecerá un mensaje que indica que "Ya se está ejecutando otra instancia".

  2. Comprueba una actualización de forma asincrónica e instala la actualización, si existe. Aparecerá un mensaje: "Una actualización está disponible" si hay una actualización disponible cuando un usuario ejecuta una nueva instancia.

El proceso para construir la aplicación de demostración es el siguiente:

Paso 1: Detecta una aplicación de instancia activa usando la clase Mutex.

namespace ClickOnceDemo { static class Program { /// summary> /// The main entry point for the application. /// /summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault( false ); bool ok; var m = new System.Threading.Mutex( true, "Application", out ok ); if ( !ok ) { MessageBox.Show( "Another instance is already running.", ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString() ); return; } Application.Run( new UpdateProgress() ); } } }

Paso 2: maneje la actualización programáticamente

Antes de hacerlo, debemos desactivar la comprobación automática de la actualización de ClickOnce (en el cuadro de diálogo Publicar - Actualizaciones ...).

A continuación, creamos dos formularios: UpdateProgress y mainForm, donde UpdateProgress indica el progreso de la descarga y mainForm representa la aplicación principal.

Cuando un usuario ejecuta la aplicación, updateProgress se lanzará en primer lugar para buscar actualizaciones. Cuando se complete la actualización, mainForm se iniciará y la actualización se ocultará.

namespace ClickOnceDemo { public partial class UpdateProgress : Form { public UpdateProgress() { InitializeComponent(); Text = "Checking for updates..."; ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; ad.CheckForUpdateCompleted += OnCheckForUpdateCompleted; ad.CheckForUpdateProgressChanged += OnCheckForUpdateProgressChanged; ad.CheckForUpdateAsync(); } private void OnCheckForUpdateProgressChanged(object sender, DeploymentProgressChangedEventArgs e) { lblStatus.Text = String.Format( "Downloading: {0}. {1:D}K of {2:D}K downloaded.", GetProgressString( e.State ), e.BytesCompleted / 1024, e.BytesTotal / 1024 ); progressBar1.Value = e.ProgressPercentage; } string GetProgressString( DeploymentProgressState state ) { if ( state == DeploymentProgressState.DownloadingApplicationFiles ) { return "application files"; } if ( state == DeploymentProgressState.DownloadingApplicationInformation ) { return "application manifest"; } return "deployment manifest"; } private void OnCheckForUpdateCompleted(object sender, CheckForUpdateCompletedEventArgs e) { if ( e.Error != null ) { MessageBox.Show( "ERROR: Could not retrieve new version of the application. Reason: /n" + e.Error.Message + "/nPlease report this error to the system administrator." ); return; } if ( e.Cancelled ) { MessageBox.Show( "The update was cancelled." ); } // Ask the user if they would like to update the application now. if ( e.UpdateAvailable ) { if ( !e.IsUpdateRequired ) { long updateSize = e.UpdateSizeBytes; DialogResult dr = MessageBox.Show( string.Format("An update ({0}K) is available. Would you like to update the application now?", updateSize/1024), "Update Available", MessageBoxButtons.OKCancel ); if ( DialogResult.OK == dr ) { BeginUpdate(); } } else { MessageBox.Show( "A mandatory update is available for your application. We will install the update now, after which we will save all of your in-progress data and restart your application." ); BeginUpdate(); } } else { ShowMainForm(); } } // Show the main application form private void ShowMainForm() { MainForm mainForm = new MainForm (); mainForm.Show(); Hide(); } private void BeginUpdate() { Text = "Downloading update..."; ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; ad.UpdateCompleted += ad_UpdateCompleted; ad.UpdateProgressChanged += ad_UpdateProgressChanged; ad.UpdateAsync(); } void ad_UpdateProgressChanged( object sender, DeploymentProgressChangedEventArgs e ) { String progressText = String.Format( "{0:D}K out of {1:D}K downloaded - {2:D}% complete", e.BytesCompleted / 1024, e.BytesTotal / 1024, e.ProgressPercentage ); progressBar1.Value = e.ProgressPercentage; lblStatus.Text = progressText; } void ad_UpdateCompleted( object sender, AsyncCompletedEventArgs e ) { if ( e.Cancelled ) { MessageBox.Show( "The update of the application''s latest version was cancelled." ); return; } if ( e.Error != null ) { MessageBox.Show( "ERROR: Could not install the latest version of the application. Reason: /n" + e.Error.Message + "/nPlease report this error to the system administrator." ); return; } DialogResult dr = MessageBox.Show( "The application has been updated. Restart? (If you do not restart now, the new version will not take effect until after you quit and launch the application again.)", "Restart Application", MessageBoxButtons.OKCancel ); if ( DialogResult.OK == dr ) { Application.Restart(); } else { ShowMainForm(); } } } }

La aplicación funciona bien y esperamos que sea una buena solución para el problema.
Un agradecimiento especial a Timothy Walters por proporcionar el código fuente