チュートリアル: ClickOnce アプリケーションのカスタム インストーラーの作成

.exe ファイルに基づく ClickOnce アプリケーションは、カスタム インストーラーによってサイレント インストールおよび更新できます。 カスタム インストーラーでは、インストール時のユーザー エクスペリエンスをカスタマイズでき、セキュリティや保守の操作に使用するカスタム ダイアログ ボックスなどを実装できます。 インストール操作を実行するには、カスタム インストーラーで InPlaceHostingManager クラスを使用します。 このチュートリアルでは、ClickOnce アプリケーションをサイレント インストールするカスタム インストーラーの作成方法を示します。

ClickOnce アプリケーションのカスタム インストーラーを作成するには

  1. ClickOnce アプリケーションで、System.Deployment および System.Windows.Forms への参照を追加します。

  2. 新しいクラスをアプリケーションに追加し、任意の名前を指定します。 このチュートリアルでは、MyInstaller という名前を使用します。

  3. 次の Imports ステートメントまたは using ステートメントを新しいクラスの先頭に追加します。

    Imports System.Deployment.Application
    Imports System.Windows.Forms
    
    using System.Deployment.Application;
    using System.Windows.Forms;
    
  4. 次のメソッドをクラスに追加します。

    これらのメソッドでは、InPlaceHostingManager メソッドを呼び出して、配置マニフェストをダウンロードし、適切なアクセス許可を与え、インストールの許可をユーザーに確認し、アプリケーションをダウンロードして ClickOnce キャッシュにインストールします。 カスタム インストーラーでは、ClickOnce アプリケーションを事前に信頼しておくことも、AssertApplicationRequirements メソッドの呼び出し時に信頼の決定を行うこともできます。 このコードでは、アプリケーションを事前に信頼しておきます。

    注意

    事前に信頼することで割り当てられるアクセス許可は、カスタム インストーラー コードのアクセス許可の範囲内でのみ有効です。

        Dim WithEvents iphm As InPlaceHostingManager = Nothing 
    
        Public Sub InstallApplication(ByVal deployManifestUriStr As String)
            Try 
                Dim deploymentUri As New Uri(deployManifestUriStr)
                iphm = New InPlaceHostingManager(deploymentUri, False)
                MessageBox.Show("Created the object.")
            Catch uriEx As UriFormatException
                MessageBox.Show("Cannot install the application: " & _
                                "The deployment manifest URL supplied is not a valid URL." & _
                                "Error: " & uriEx.Message)
                Return 
            Catch platformEx As PlatformNotSupportedException
                MessageBox.Show("Cannot install the application: " & _
                                "This program requires Windows XP or higher. " & _
                                "Error: " & platformEx.Message)
                Return 
            Catch argumentEx As ArgumentException
                MessageBox.Show("Cannot install the application: " & _
                                "The deployment manifest URL supplied is not a valid URL." & _
                                "Error: " & argumentEx.Message)
                Return 
            End Try
    
            iphm.GetManifestAsync()
        End Sub 
    
        Private Sub iphm_GetManifestCompleted(ByVal sender As Object, ByVal e As GetManifestCompletedEventArgs) Handles iphm.GetManifestCompleted
            ' Check for an error. 
            If (e.Error IsNot Nothing) Then 
                ' Cancel download and install.
                MessageBox.Show("Could not download manifest. Error: " & e.Error.Message)
                Return 
            End If 
    
            ' Dim isFullTrust As Boolean = CheckForFullTrust(e.ApplicationManifest) 
    
            ' Verify this application can be installed. 
            Try 
                ' the true parameter allows InPlaceHostingManager 
                ' to grant the permissions requested in the application manifest. 
                iphm.AssertApplicationRequirements(True)
            Catch ex As Exception
                MessageBox.Show("An error occurred while verifying the application. " & _
                                "Error text: " & ex.Message)
                Return 
            End Try 
    
            ' Use the information from GetManifestCompleted() to confirm  
            ' that the user wants to proceed. 
            Dim appInfo As String = "Application Name: " & e.ProductName
            appInfo &= ControlChars.Lf & "Version: " & e.Version.ToString()
            appInfo &= ControlChars.Lf & "Support/Help Requests: " 
    
            If Not (e.SupportUri Is Nothing) Then
                appInfo &= e.SupportUri.ToString()
            Else
                appInfo &= "N/A" 
            End If
    
            appInfo &= ControlChars.Lf & ControlChars.Lf & _
                "Confirmed that this application can run with its requested permissions." 
    
            ' If isFullTrust Then 
            '    appInfo &= ControlChars.Lf & ControlChars.Lf & _ 
            '        "This application requires full trust in order to run." 
            ' End If
    
            appInfo &= ControlChars.Lf & ControlChars.Lf & "Proceed with installation?" 
    
            Dim dr As DialogResult = MessageBox.Show(appInfo, _
                "Confirm Application Install", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
            If dr <> System.Windows.Forms.DialogResult.OK Then 
                Return 
            End If 
    
            ' Download the deployment manifest.  
            ' Usually, this shouldn't throw an exception unless  
            ' AssertApplicationRequirements() failed, or you did not call that method 
            ' before calling this one. 
            Try
                iphm.DownloadApplicationAsync()
            Catch downloadEx As Exception
                MessageBox.Show("Cannot initiate download of application. Error: " & downloadEx.Message)
                Return 
            End Try 
        End Sub
    
    #If 0 Then 
        Private Function CheckForFullTrust(ByVal appManifest As XmlReader) As Boolean 
            Dim isFullTrust As Boolean = False 
    
            If (appManifest Is Nothing) Then 
                Throw New ArgumentNullException("appManifest cannot be null.")
            End If 
    
            Dim xaUnrestricted As XAttribute
            xaUnrestricted = XDocument.Load(appManifest) _
                .Element("{urn:schemas-microsoft-com:asm.v1}assembly") _
                .Element("{urn:schemas-microsoft-com:asm.v2}trustInfo") _
                .Element("{urn:schemas-microsoft-com:asm.v2}security") _
                .Element("{urn:schemas-microsoft-com:asm.v2}applicationRequestMinimum") _
                .Element("{urn:schemas-microsoft-com:asm.v2}PermissionSet") _
                .Attribute("Unrestricted")  ' Attributes never have a namespace
    
    
            If xaUnrestricted Then 
                If xaUnrestricted.Value = "true" Then 
                    Return True 
                End If 
            End If 
    
            Return False 
        End Function
    #End If 
    
        Private Sub iphm_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) Handles iphm.DownloadProgressChanged
            ' you can show percentage of task completed using e.ProgressPercentage 
        End Sub 
    
        Private Sub iphm_DownloadApplicationCompleted(ByVal sender As Object, ByVal e As DownloadApplicationCompletedEventArgs) Handles iphm.DownloadApplicationCompleted
            ' Check for an error. 
            If (e.Error IsNot Nothing) Then 
                ' Cancel download and install.
                MessageBox.Show("Could not download and install application. Error: " & e.Error.Message)
                Return 
            End If 
    
            ' Inform the user that their application is ready for use. 
            MessageBox.Show("Application installed! You may now run it from the Start menu.")
        End Sub
    
    InPlaceHostingManager iphm = null;
    
    public void InstallApplication(string deployManifestUriStr)
    {
        try
        {
            Uri deploymentUri = new Uri(deployManifestUriStr);
            iphm = new InPlaceHostingManager(deploymentUri, false);
        }
        catch (UriFormatException uriEx)
        {
            MessageBox.Show("Cannot install the application: " + 
                "The deployment manifest URL supplied is not a valid URL. " +
                "Error: " + uriEx.Message);
            return;
        }
        catch (PlatformNotSupportedException platformEx)
        {
            MessageBox.Show("Cannot install the application: " + 
                "This program requires Windows XP or higher. " +
                "Error: " + platformEx.Message);
            return;
        }
        catch (ArgumentException argumentEx)
        {
            MessageBox.Show("Cannot install the application: " + 
                "The deployment manifest URL supplied is not a valid URL. " +
                "Error: " + argumentEx.Message);
            return;
        }
    
        iphm.GetManifestCompleted += new EventHandler<GetManifestCompletedEventArgs>(iphm_GetManifestCompleted);
        iphm.GetManifestAsync();
    }
    
    void iphm_GetManifestCompleted(object sender, GetManifestCompletedEventArgs e)
    {
        // Check for an error. 
        if (e.Error != null)
        {
            // Cancel download and install.
            MessageBox.Show("Could not download manifest. Error: " + e.Error.Message);
            return;
        }
    
        // bool isFullTrust = CheckForFullTrust(e.ApplicationManifest); 
    
        // Verify this application can be installed. 
        try
        {
            // the true parameter allows InPlaceHostingManager 
            // to grant the permissions requested in the applicaiton manifest.
            iphm.AssertApplicationRequirements(true) ; 
        }
        catch (Exception ex)
        {
            MessageBox.Show("An error occurred while verifying the application. " +
                "Error: " + ex.Message);
            return;
        }
    
        // Use the information from GetManifestCompleted() to confirm  
        // that the user wants to proceed. 
        string appInfo = "Application Name: " + e.ProductName;
        appInfo += "\nVersion: " + e.Version;
        appInfo += "\nSupport/Help Requests: " + (e.SupportUri != null ?
            e.SupportUri.ToString() : "N/A");
        appInfo += "\n\nConfirmed that this application can run with its requested permissions.";
        // if (isFullTrust) 
        // appInfo += "\n\nThis application requires full trust in order to run.";
        appInfo += "\n\nProceed with installation?";
    
        DialogResult dr = MessageBox.Show(appInfo, "Confirm Application Install",
            MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
        if (dr != System.Windows.Forms.DialogResult.OK)
        {
            return;
        }
    
        // Download the deployment manifest. 
        iphm.DownloadProgressChanged += new EventHandler<DownloadProgressChangedEventArgs>(iphm_DownloadProgressChanged);
        iphm.DownloadApplicationCompleted += new EventHandler<DownloadApplicationCompletedEventArgs>(iphm_DownloadApplicationCompleted);
    
        try
        {
            // Usually this shouldn't throw an exception unless AssertApplicationRequirements() failed,  
            // or you did not call that method before calling this one.
            iphm.DownloadApplicationAsync();
        }
        catch (Exception downloadEx)
        {
            MessageBox.Show("Cannot initiate download of application. Error: " +
                downloadEx.Message);
            return;
        }
    }
    
    /*
    private bool CheckForFullTrust(XmlReader appManifest)
    {
        if (appManifest == null)
        {
            throw (new ArgumentNullException("appManifest cannot be null."));
        }
    
        XAttribute xaUnrestricted =
            XDocument.Load(appManifest)
                .Element("{urn:schemas-microsoft-com:asm.v1}assembly")
                .Element("{urn:schemas-microsoft-com:asm.v2}trustInfo")
                .Element("{urn:schemas-microsoft-com:asm.v2}security")
                .Element("{urn:schemas-microsoft-com:asm.v2}applicationRequestMinimum")
                .Element("{urn:schemas-microsoft-com:asm.v2}PermissionSet")
                .Attribute("Unrestricted"); // Attributes never have a namespace
    
        if (xaUnrestricted != null)
            if (xaUnrestricted.Value == "true")
                return true;
    
        return false;
    }
    */ 
    
    void iphm_DownloadApplicationCompleted(object sender, DownloadApplicationCompletedEventArgs e)
    {
        // Check for an error. 
        if (e.Error != null)
        {
            // Cancel download and install.
            MessageBox.Show("Could not download and install application. Error: " + e.Error.Message);
            return;
        }
    
        // Inform the user that their application is ready for use. 
        MessageBox.Show("Application installed! You may now run it from the Start menu.");
    }
    
    void iphm_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        // you can show percentage of task completed using e.ProgressPercentage
    }
    
  5. コードからインストールを実行するには、InstallApplication メソッドを呼び出します。 たとえば、クラス名を MyInstaller にした場合、次のように InstallApplication を呼び出します。

    Dim installer As New MyInstaller()
    installer.InstallApplication("\\myServer\myShare\myApp.application")
    MessageBox.Show("Installer object created.")
    
    MyInstaller installer = new MyInstaller();
    installer.InstallApplication(@"\\myServer\myShare\myApp.application");
    MessageBox.Show("Installer object created.");
    

次の手順

ClickOnce アプリケーションでは、更新プロセス時に表示されるカスタム ユーザー インターフェイスなど、カスタムの更新ロジックを追加することもできます。 詳細については、UpdateCheckInfo を参照してください。 また、<customUX> 要素を使用して、標準のスタート メニュー エントリ、ショートカット、および [プログラムの追加または削除] エントリを非表示にすることもできます。 詳細については、「<entryPoint> 要素 (ClickOnce アプリケーション)」および「ShortcutAppId」を参照してください。

参照

関連項目

ClickOnce アプリケーション マニフェスト

<entryPoint> 要素 (ClickOnce アプリケーション)