ApplicationDeployment クラス

定義

プログラムによる現在の配置の更新と、必要に応じたファイルのダウンロード処理をサポートします。Supports updates of the current deployment programmatically, and handles on-demand downloading of files. このクラスは継承できません。This class cannot be inherited.

public ref class ApplicationDeployment sealed
public sealed class ApplicationDeployment
type ApplicationDeployment = class
Public NotInheritable Class ApplicationDeployment
継承
ApplicationDeployment

次のコード例では、アプリケーションの読み込み時に新しい更新プログラムが利用可能かどうかを判断します。必要な更新プログラムが利用可能な場合、このコード例では更新プログラムを非同期にインストールします。The following code example determines at application load time whether a new update is available; if a required update is available, the code example installs the update asynchronously. このコードは、downloadStatusという名前の TextBox を含むフォームに追加する必要があります。This code should be added to a form that contains a TextBox named downloadStatus.

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;
    }
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);
    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);
    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 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

注釈

更新プログラムを確認し、配置マニフェストの subscription 要素を通じてそれらを自動的にインストールするように ClickOnceClickOnce アプリケーションを構成できます。You can configure your ClickOnceClickOnce application to check for updates and install them automatically through the subscription element of the deployment manifest. ただし、一部のアプリケーションでは、更新プログラムをより細かく制御する必要があります。Some applications, however, need finer control over their updates. 必要な更新プログラムをプログラムでインストールし、必要に応じてオプションの更新プログラムをインストールするようにユーザーに求めることができます。You may want to install required updates programmatically, and prompt users to install optional updates at their convenience. デプロイマニフェストでサブスクリプションの更新をオフにすることで、アプリケーションの更新ポリシーを完全に制御できます。By turning off subscription updates in the deployment manifest, you can take complete control of your application's update policies. または、自動サブスクリプションを ApplicationDeploymentと組み合わせて使用することもできます。これにより、ClickOnceClickOnce はアプリケーションを定期的に更新できますが、リリース後すぐに重要な更新プログラムをダウンロードするには ApplicationDeployment を使用します。Alternatively, you can use automatic subscription in conjunction with ApplicationDeployment, which enables ClickOnceClickOnce to update the application periodically, but uses ApplicationDeployment to download critical updates shortly after they are released.

CheckForUpdate または CheckForUpdateAsync のいずれかの方法を使用して、配置に使用可能な更新プログラムがあるかどうかをテストできます。後者のメソッドは、正常に完了したときに CheckForUpdateCompleted イベントを発生させます。You can test whether your deployment has an available update by using either the CheckForUpdate or the CheckForUpdateAsync method; the latter method raises the CheckForUpdateCompleted event on successful completion. CheckForDetailedUpdate は、更新プログラムに関する重要な情報 (バージョン番号、現在のユーザーに必要な更新かどうかなど) を返します。CheckForDetailedUpdate returns important information about the update, such as its version number and whether it is a required update for current users. 更新プログラムが利用可能な場合は、Update または UpdateAsyncを使用してインストールできます。後者の方法では、更新プログラムのインストールが完了した後に、UpdateCompleted イベントが発生します。If an update is available, you can install it by using Update or UpdateAsync; the latter method raises the UpdateCompleted event after installation of the update is complete. 大きな更新プログラムの場合は、CheckForUpdateProgressChanged イベントと UpdateProgressChanged イベントを使用して進行状況の通知を受け取り、ProgressChangedEventArgs の情報を使用して、ダウンロードの状態をユーザーに通知することができます。For large updates, you can receive progress notifications through the CheckForUpdateProgressChanged and UpdateProgressChanged events, and use the information in ProgressChangedEventArgs to notify the user of the download status.

ApplicationDeployment を使用して、必要に応じて大きなファイルやアセンブリをダウンロードすることもできます。You can also use ApplicationDeployment to download large files and assemblies on demand. これらのファイルは、インストール時にダウンロードされないように、配置のアプリケーションマニフェスト内で "省略可能" としてマークされている必要があります。These files must be marked as "optional" within the deployment's application manifest so that they are not downloaded during installation. DownloadFileGroup または DownloadFileGroupAsync 方法を使用して、アプリケーションの実行中の任意の時点でファイルをダウンロードできます。You can download the files at any point during the application's duration by using the DownloadFileGroup or the DownloadFileGroupAsync method. AppDomain クラスの AssemblyResolve イベントのイベントハンドラーを指定することにより、アセンブリをメモリに読み込む前にダウンロードできます。You can download assemblies before they are loaded into memory by supplying an event handler for the AssemblyResolve event on the AppDomain class. 詳細については、「チュートリアル : デザイナーを使用し、ClickOnce 配置 API で必要に応じてアセンブリをダウンロードする」を参照してください。For more information, see Walkthrough: Downloading Assemblies on Demand with the ClickOnce Deployment API Using the Designer.

注意

アプリケーションの実行中に ClickOnceClickOnce アプリケーションを更新した場合、ユーザーは ApplicationRestart メソッドを呼び出すまで更新を表示しません。これにより、アプリケーションの現在実行中のインスタンスが閉じられ、すぐに再起動します。If you update a ClickOnceClickOnce application while the application is running, the user will not see the updates until you call the Restart method of the Application, which will close the current running instance of the application and immediately restart it.

ApplicationDeployment にはパブリックコンストラクターがありません。ClickOnceClickOnce アプリケーション内のクラスのインスタンスを取得するには、CurrentDeployment プロパティを使用します。ApplicationDeployment has no public constructor; you obtain instances of the class within a ClickOnceClickOnce application through the CurrentDeployment property. 現在のアプリケーションが ClickOnceClickOnce アプリケーションであることを確認するには、IsNetworkDeployed プロパティを使用します。You use the IsNetworkDeployed property to verify that the current application is a ClickOnceClickOnce application.

ApplicationDeployment は、クラスイベントとして完了コールバックを公開する新しいイベントベースの非同期パターンの概要を使用して、更新を確認し、更新されたファイルを非同期的にダウンロードすることをサポートしています。ApplicationDeployment supports checking for updates and downloading updated files asynchronously by using the new Event-based Asynchronous Pattern Overview, which exposes completion callbacks as class events. ApplicationDeployment はスレッドを開始して管理し、正しい UI スレッドでアプリケーションを呼び出します。ApplicationDeployment starts and manages the threads for you, and calls your application back on the correct UI thread. このクラスを使用すると、更新プログラムのインストール中にユーザーが作業を続行できるように、アプリケーションをロックせずに更新できます。Through this class, you can update without locking up the application, so that the user can continue working while the update installs. 更新の実行中にユーザーがすべての作業を停止する必要がある場合は、代わりに同期メソッドを使用することを検討してください。If the user must stop all work while an update takes place, consider using the synchronous methods instead.

注意

非同期更新を実行するには、アプリケーションが System.Deployment.ApplicationSystem.ComponentModel の両方の名前空間をインポートする必要があります。Performing asynchronous updates requires that your application import both the System.Deployment.Application and System.ComponentModel namespaces.

プロパティ

ActivationUri

アプリケーションの配置マニフェストを起動するために使用する URL を取得します。Gets the URL used to launch the deployment manifest of the application.

CurrentDeployment

この配置の現在の ApplicationDeployment を返します。Returns the current ApplicationDeployment for this deployment.

CurrentVersion

アプリケーションの現在実行中のインスタンスの配置のバージョンを取得します。Gets the version of the deployment for the current running instance of the application.

DataDirectory

ClickOnceClickOnce データ ディレクトリへのパスを取得します。Gets the path to the ClickOnceClickOnce data directory.

IsFirstRun

クライアント コンピューターでこのアプリケーションを実行したのは今回が初めてかどうかを示す値を取得します。Gets a value indicating whether this is the first time this application has run on the client computer.

IsNetworkDeployed

現在のアプリケーションが ClickOnceClickOnce アプリケーションかどうかを示す値を取得します。Gets a value indicating whether the current application is a ClickOnceClickOnce application.

TimeOfLastUpdateCheck

ClickOnceClickOnce がアプリケーションの更新プログラムを最後にチェックした日時と時刻を取得します。Gets the date and the time ClickOnceClickOnce last checked for an application update.

UpdatedApplicationFullName

アプリケーションの更新後に、アプリケーションの完全名を取得します。Gets the full name of the application after it has been updated.

UpdatedVersion

最近ダウンロードされた更新プログラムのバージョンを取得します。Gets the version of the update that was recently downloaded.

UpdateLocation

このアプリケーションの更新元である Web サイトまたはファイル共有を取得します。Gets the Web site or file share from which this application updates itself.

メソッド

CheckForDetailedUpdate()

CheckForUpdate() と同じ操作を実行しますが、利用可能な更新プログラムの拡張情報を返します。Performs the same operation as CheckForUpdate(), but returns extended information about the available update.

CheckForDetailedUpdate(Boolean)

CheckForUpdate() と同じ操作を実行しますが、利用可能な更新プログラムの拡張情報を返します。Performs the same operation as CheckForUpdate(), but returns extended information about the available update.

CheckForUpdate()

UpdateLocation をチェックし、新しい更新プログラムを利用できるかどうかを確認します。Checks UpdateLocation to determine whether a new update is available.

CheckForUpdate(Boolean)

UpdateLocation をチェックし、新しい更新プログラムを利用できるかどうかを確認します。Checks UpdateLocation to determine whether a new update is available.

CheckForUpdateAsync()

UpdateLocation を非同期でチェックし、新しい更新プログラムを利用できるかどうかを確認します。Checks UpdateLocation asynchronously to determine whether a new update is available.

CheckForUpdateAsyncCancel()

非同期の更新プログラムのチェックをキャンセルします。Cancels the asynchronous update check.

DownloadFileGroup(String)

一連のオプション ファイルを必要に応じてダウンロードします。Downloads a set of optional files on demand.

DownloadFileGroupAsync(String)

一連のオプション ファイルを、必要に応じてバックグラウンドでダウンロードします。Downloads, on demand, a set of optional files in the background.

DownloadFileGroupAsync(String, Object)

一連のオプション ファイルを、必要に応じてバックグラウンドでダウンロードし、アプリケーションの状態の一部をイベント コールバックに渡します。Downloads, on demand, a set of optional files in the background, and passes a piece of application state to the event callbacks.

DownloadFileGroupAsyncCancel(String)

ファイルの非同期ダウンロードをキャンセルします。Cancels an asynchronous file download.

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判定します。Determines whether the specified object is equal to the current object.

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(継承元 Object)
IsFileGroupDownloaded(String)

クライアント コンピューターに、名前付きファイル グループが既にダウンロードされているかどうかをチェックします。Checks whether the named file group has already been downloaded to the client computer.

MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(継承元 Object)
ToString()

現在のオブジェクトを表す string を返します。Returns a string that represents the current object.

(継承元 Object)
Update()

このアプリケーションの最新バージョンの同期ダウンロードとインストールを開始します。Starts a synchronous download and installation of the latest version of this application.

UpdateAsync()

このアプリケーションの最新バージョンの非同期ダウンロードとインストールを開始します。Starts an asynchronous download and installation of the latest version of this application.

UpdateAsyncCancel()

UpdateAsync() によって開始された非同期更新をキャンセルします。Cancels an asynchronous update initiated by UpdateAsync().

イベント

CheckForUpdateCompleted

CheckForUpdateAsync() の完了時に発生します。Occurs when CheckForUpdateAsync() has completed.

CheckForUpdateProgressChanged

CheckForUpdateAsync() の呼び出しで進行状況の更新を使用できる場合に発生します。Occurs when a progress update is available on a CheckForUpdateAsync() call.

DownloadFileGroupCompleted

ファイルのダウンロードが完了すると、メイン アプリケーション スレッドで発生します。Occurs on the main application thread when a file download is complete.

DownloadFileGroupProgressChanged

DownloadFileGroupAsync の呼び出しによって開始されたファイルのダウンロード操作で、ステータス情報を使用できる場合に発生します。Occurs when status information is available on a file download operation initiated by a call to DownloadFileGroupAsync.

UpdateCompleted

ClickOnceClickOnce の呼び出しの結果として、UpdateAsync() がアプリケーションのアップグレードを完了したときに発生します。Occurs when ClickOnceClickOnce has finished upgrading the application as the result of a call to UpdateAsync().

UpdateProgressChanged

ClickOnceClickOnce メソッドの呼び出しによって開始された更新操作について、UpdateAsync() に新しいステータス情報がある場合に発生します。Occurs when ClickOnceClickOnce has new status information for an update operation initiated by calling the UpdateAsync() method.

適用対象

こちらもご覧ください