Actualización:
Julio de 2008
Admite actualizaciones de la implementación actual mediante programación y controla la descarga de archivos a petición. Esta clase no se puede heredar.
Espacio de nombres:
System.Deployment.Application
Ensamblado:
System.Deployment (en System.Deployment.dll)
Visual Basic (Declaración)
Public NotInheritable Class ApplicationDeployment
Dim instance As ApplicationDeployment
public sealed class ApplicationDeployment
public ref class ApplicationDeployment sealed
public final class ApplicationDeployment
public final class ApplicationDeployment
Se puede configurar la aplicación ClickOnce para comprobar si hay actualizaciones e instalarlas automáticamente a través del elemento subscription del manifiesto de implementación. Algunas aplicaciones, sin embargo, requieren un control más riguroso de las actualizaciones. Quizás desee instalar las actualizaciones necesarias mediante programación e instar a los usuarios a instalar las actualizaciones opcionales cuando les resulte conveniente. Si desactiva las actualizaciones mediante suscripción en el manifiesto de implementación, podrá controlar totalmente las directivas de actualización de la aplicación. También puede utilizar la suscripción automática junto con ApplicationDeployment, que permite que ClickOnce actualice periódicamente la aplicación, pero que usa ApplicationDeployment para descargar las actualizaciones críticas poco después de su lanzamiento.
Puede comprobar si hay una actualización disponible para la implementación utilizando los métodos CheckForUpdate o CheckForUpdateAsync; el último método provoca el evento CheckForUpdateCompleted cuando se realiza correctamente. CheckForDetailedUpdate devuelve información importante sobre la actualización, como su número de versión y si es una actualización necesaria para los usuarios actuales. Si hay una actualización disponible, puede instalarla mediante el método Update o UpdateAsync; el último método provoca el evento UpdateCompleted al término de la instalación de la actualización. Para las actualizaciones grandes, puede recibir notificaciones de progreso a través de los eventos CheckForUpdateProgressChanged y UpdateProgressChanged, además de utilizar la información de ProgressChangedEventArgs para notificar al usuario del estado de la descarga.
También puede utilizar ApplicationDeployment para descargar archivos grandes y ensamblados a petición. Estos archivos se deben marcar como "opcionales" en el manifiesto de aplicación de la implementación para que no se descarguen durante la instalación. Puede descargar los archivos en cualquier momento mediante los métodos DownloadFileGroup o DownloadFileGroupAsync. Puede descargar los ensamblados antes de que se carguen en la memoria proporcionando un controlador de eventos para el evento AssemblyResolve en la clase AppDomain. Para obtener más información, vea Tutorial: Descargar ensamblados a petición con la API de implementación de ClickOnce mediante el diseñador.
Nota: |
|---|
Si actualiza una aplicación ClickOnce mientras se ejecuta, el usuario no verá las actualizaciones hasta que llame al método Restart de Application, lo que cerrará la sesión actualmente en ejecución de la aplicación y la reiniciará inmediatamente. |
ApplicationDeployment no tiene ningún constructor público; las instancias de la clase en una aplicación ClickOnce se obtienen a través de la propiedad CurrentDeployment. Se utiliza la propiedad IsNetworkDeployed para comprobar que la aplicación actual es una aplicación ClickOnce.
ApplicationDeployment admite la comprobación de la existencia de actualizaciones y la descarga asincrónica de los archivos actualizados mediante el nuevo Información general sobre el modelo asincrónico basado en eventos, que expone las devoluciones de llamada de finalización como eventos de clase; ApplicationDeployment inicia y administra los subprocesos, además de llamar a la aplicación en el subproceso de interfaz de usuario correcto. Mediante esta clase, puede realizar la actualización sin bloquear la aplicación. Por tanto, el usuario puede seguir trabajando durante la instalación de la misma. Si el usuario tiene que interrumpir el trabajo durante una actualización, considere la posibilidad de utilizar métodos sincrónicos.
En el ejemplo de código siguiente se determina si hay una nueva actualización disponible durante la carga de la aplicación; si se trata de una actualización necesaria, el ejemplo de código la instala asincrónicamente.
Private sizeOfUpdate As Long = 0
Dim WithEvents ADUpdateAsync As ApplicationDeployment
Private Sub UpdateApplication()
If (ApplicationDeployment.IsNetworkDeployed) Then
ADUpdateAsync = ApplicationDeployment.CurrentDeployment
ADUpdateAsync.CheckForUpdateAsync()
End If
End Sub
Private Sub ADUpdateAsync_CheckForUpdateProgressChanged(ByVal sender As Object, ByVal e As DeploymentProgressChangedEventArgs) Handles ADUpdateAsync.CheckForUpdateProgressChanged
DownloadStatus.Text = [String].Format("{0:D}K of {1:D}K downloaded.", e.BytesCompleted / 1024, e.BytesTotal / 1024)
End Sub
Private Sub ADUpdateAsync_CheckForUpdateCompleted(ByVal sender As Object, ByVal e As CheckForUpdateCompletedEventArgs) Handles ADUpdateAsync.CheckForUpdateCompleted
If (e.Error IsNot Nothing) Then
MessageBox.Show(("ERROR: Could not retrieve new version of the application. Reason: " + ControlChars.Lf + e.Error.Message + ControlChars.Lf + "Please report this error to the system administrator."))
Return
Else
If (e.Cancelled = True) Then
MessageBox.Show("The update was cancelled.")
End If
End If
' Ask the user if they would like to update the application now.
If (e.UpdateAvailable) Then
sizeOfUpdate = e.UpdateSizeBytes
If (Not e.IsUpdateRequired) Then
Dim dr As DialogResult = MessageBox.Show("An update is available. Would you like to update the application now?", "Update Available", MessageBoxButtons.OKCancel)
If (System.Windows.Forms.DialogResult.OK = dr) Then
BeginUpdate()
End If
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()
End If
End If
End Sub
Private Sub BeginUpdate()
ADUpdateAsync = ApplicationDeployment.CurrentDeployment
ADUpdateAsync.UpdateAsync()
End Sub
Private Sub ADUpdateAsync_UpdateProgressChanged(ByVal sender As Object, ByVal e As DeploymentProgressChangedEventArgs) Handles ADUpdateAsync.UpdateProgressChanged
Dim progressText As String = String.Format("{0:D}K out of {1:D}K downloaded - {2:D}% complete", e.BytesCompleted / 1024, e.BytesTotal / 1024, e.ProgressPercentage)
DownloadStatus.Text = progressText
End Sub
Private Sub ADUpdateAsync_UpdateCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs) Handles ADUpdateAsync.UpdateCompleted
If (e.Cancelled) Then
MessageBox.Show("The update of the application's latest version was cancelled.")
Exit Sub
Else
If (e.Error IsNot Nothing) Then
MessageBox.Show("ERROR: Could not install the latest version of the application. Reason: " + ControlChars.Lf + e.Error.Message + ControlChars.Lf + "Please report this error to the system administrator.")
Exit Sub
End If
End If
Dim dr As DialogResult = 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 (dr = System.Windows.Forms.DialogResult.OK) Then
Application.Restart()
End If
End Sub
long sizeOfUpdate = 0;
private void UpdateApplication()
{
if (ApplicationDeployment.IsNetworkDeployed)
{
ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
ad.CheckForUpdateCompleted += new CheckForUpdateCompletedEventHandler(ad_CheckForUpdateCompleted);
ad.CheckForUpdateProgressChanged += new DeploymentProgressChangedEventHandler(ad_CheckForUpdateProgressChanged);
ad.CheckForUpdateAsync();
}
}
void ad_CheckForUpdateProgressChanged(object sender, DeploymentProgressChangedEventArgs e)
{
downloadStatus.Text = String.Format("Downloading: {0}. {1:D}K of {2:D}K downloaded.", GetProgressString(e.State), e.BytesCompleted/1024, e.BytesTotal/1024);
}
string GetProgressString(DeploymentProgressState state)
{
if (state == DeploymentProgressState.DownloadingApplicationFiles)
{
return "application files";
}
else if (state == DeploymentProgressState.DownloadingApplicationInformation)
{
return "application manifest";
}
else
{
return "deployment manifest";
}
}
void ad_CheckForUpdateCompleted(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;
}
else if (e.Cancelled == true)
{
MessageBox.Show("The update was cancelled.");
}
// Ask the user if they would like to update the application now.
if (e.UpdateAvailable)
{
sizeOfUpdate = e.UpdateSizeBytes;
if (!e.IsUpdateRequired)
{
DialogResult dr = MessageBox.Show("An update is available. Would you like to update the application now?\n\nEstimated Download Time: ", "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();
}
}
}
private void BeginUpdate()
{
ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
ad.UpdateCompleted += new AsyncCompletedEventHandler(ad_UpdateCompleted);
// Indicate progress in the application's status bar.
ad.UpdateProgressChanged += new DeploymentProgressChangedEventHandler(ad_UpdateProgressChanged);
}
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);
downloadStatus.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;
}
else 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();
}
}
private:
long sizeOfUpdate;
private:
void Form1_Load(Object^ sender, System::EventArgs^ e)
{
DoUpdate();
}
public:
void DoUpdate()
{
if (ApplicationDeployment::IsNetworkDeployed)
{
ApplicationDeployment^ currentAppDeployment =
ApplicationDeployment::CurrentDeployment;
currentAppDeployment->CheckForUpdateCompleted +=
gcnew CheckForUpdateCompletedEventHandler(
this, &Form1::currentDeploy_CheckForUpdateCompleted);
currentAppDeployment->CheckForUpdateAsync();
}
}
// If update is available, fetch it.
void currentDeploy_CheckForUpdateCompleted(Object^ sender,
CheckForUpdateCompletedEventArgs^ e)
{
if (nullptr != e->Error)
{
// Log error.
return;
}
if (e->UpdateAvailable)
{
sizeOfUpdate = (long) e->UpdateSizeBytes;
if (!e->IsUpdateRequired)
{
System::Windows::Forms::DialogResult
updateDialogueResult = MessageBox::Show(
"An update is available.Would you like to update the" +
" application now?", "Update Available",
MessageBoxButtons::OKCancel);
if (System::Windows::Forms::DialogResult::OK ==
updateDialogueResult)
{
BeginUpdate();
}
}
else
{
BeginUpdate();
}
}
}
void BeginUpdate()
{
ApplicationDeployment^ ad = ApplicationDeployment::CurrentDeployment;
ad->UpdateCompleted +=
gcnew AsyncCompletedEventHandler(
this, &Form1::CurrentDeployment_UpdateCompleted);
// Indicate progress in the application's status bar.
ad->UpdateProgressChanged +=
gcnew DeploymentProgressChangedEventHandler(this,
&Form1::ad_ProgressChanged);
ad->UpdateAsync();
}
void CurrentDeployment_UpdateCompleted(Object^ sender,
AsyncCompletedEventArgs^ e)
{
if (!e->Cancelled)
{
if (nullptr != e->Error)
{
System::Windows::Forms::DialogResult
restartDialogueResult = MessageBox::Show(
"The application has been updated. Restart?",
"Restart Application",
MessageBoxButtons::OKCancel);
if (System::Windows::Forms::DialogResult::OK ==
restartDialogueResult)
{
Application::Restart();
}
}
else
{
// Replace with your own error reporting or logging.
MessageBox::Show(
"The application encountered an error in downloading" +
" the latest update. Error: {0}",
e->Error->Message);
}
}
else
{
// Replace with your own error reporting or logging.
MessageBox::Show("The update of the application's latest" +
" version was cancelled.");
}
}
void ad_ProgressChanged(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);
statusStrip1->Text = progressText;
}
System..::.Object
System.Deployment.Application..::.ApplicationDeployment
Seguridad para subprocesos
Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
.NET Framework
Compatible con: 3.5, 3.0, 2.0
Referencia
Otros recursos