it技術:dotnet:インストーラーの作成
差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
it技術:インストーラーの作成 [2017/03/30 18:05] – 作成 yajuadmin | it技術:dotnet:インストーラーの作成 [2020/07/28 16:08] – [カスタム動作にデータを渡す] yajuadmin | ||
---|---|---|---|
行 6: | 行 6: | ||
===== Visual Studio Installer の入手方法 ===== | ===== Visual Studio Installer の入手方法 ===== | ||
- | ツール - 拡張機能と更新プログラム で、installer を検索し、Microsoft Visual Studio | + | ツール - 拡張機能と更新プログラム で、installer を検索し、Microsoft Visual Studio Installer Projects Extension をダウンロード |
- | 参照: | + | |
+ | * [[http:// | ||
+ | * [[https:// | ||
===== インストーラープロジェクトの作成 ===== | ===== インストーラープロジェクトの作成 ===== | ||
インストールが完了したら、対称のソリューションをVisual Studio で開き、ファイル - 新規作成 - プロジェクト を実行し、その他のプロジェクトの種類を展開。WindowsSetup プロジェクトをソリューションに追加する。 | インストールが完了したら、対称のソリューションをVisual Studio で開き、ファイル - 新規作成 - プロジェクト を実行し、その他のプロジェクトの種類を展開。WindowsSetup プロジェクトをソリューションに追加する。 | ||
行 19: | 行 20: | ||
* アンインストール時にインストールフォルダを確認後に完全削除させる。 | * アンインストール時にインストールフォルダを確認後に完全削除させる。 | ||
* 設定ファイルのユーザー情報の格納場所(AppData)の削除はしない。 | * 設定ファイルのユーザー情報の格納場所(AppData)の削除はしない。 | ||
+ | |||
+ | DefaultLocationプロパティを固定フォルダにしてしまうとセットアップ時にフォルダ選択画面が表示されない。その場合、DefaultLocationプロパティを[WindowsVolume]\[ProductName]にする。\\ | ||
+ | ※ProductNameとフォルダ名が一致している場合\\ | ||
+ | [[https:// | ||
+ | |||
+ | ===== プロパティの設定 ===== | ||
+ | 【画像挿入】\\ | ||
+ | |||
+ | ^InstallAllUsers|True: | ||
+ | ===== ファイルシステムの設定 ===== | ||
+ | Setupプロジェクトにて右クリックメニューにある「View」から「ファイルシステム」を選択します。\\ | ||
+ | {{: | ||
+ | 下記のファイルシステムが表示されます。\\ | ||
+ | {{: | ||
+ | |||
+ | ===== プライマリ出力 ===== | ||
+ | 「Application Folder」を選択して右クリックメニューにある「Add」から「プロジェクト出力」を選択します。\\ | ||
+ | {{: | ||
+ | プライマリ出力を選択し、構成を「アクティブ」のまま「OK」ボタンをクリックします。\\ | ||
+ | {{: | ||
+ | プライマリ出力のファイルと関連したdllが出力されます。\\ | ||
+ | |||
+ | ===== フォルダやファイルの追加 ===== | ||
+ | 「Application Folder」を選択して右クリックメニューにある「Add」から「Folder」や「ファイル」を選択します。\\ | ||
+ | その後に必要なフォルダを作成しつつ必要なファイルを選択します。\\ | ||
+ | 【画像挿入】\\ | ||
+ | フォルダを作成した場合、プロパティの「AlwaysCreate」を「True」にしておかないとインストール時に作成されません。\\ | ||
+ | 【画像挿入】\\ | ||
+ | |||
+ | ===== ショートカットの作成 ===== | ||
+ | 「プライマリ出力 from XXXX」の右クリックメニューにある「Create Shortcut to プライマリ出力 from XXXX」をクリックします。\\ | ||
+ | 【画像挿入】\\ | ||
+ | |||
+ | ===== ショートカットのコピー ===== | ||
+ | デスクトップ画面にショートカットを作成します。\\ | ||
+ | 先程作成した「Create Shortcut to プライマリ出力 from XXXX」をドラッグ&ドロップして、「User' | ||
+ | 【画像挿入】\\ | ||
+ | ※「User' | ||
+ | プログラムメニューも同様にします。先にフォルダを作成します。\\ | ||
+ | 「Create Shortcut to プライマリ出力 from XXXX」をドラッグ&ドロップして、「User' | ||
+ | 【画像挿入】\\ | ||
+ | |||
+ | ※どちらのショートカットともプロパティの「Icon」を設定して変更します。 | ||
+ | ===== カスタム動作の作成 ===== | ||
+ | 今回、アンインストール時にログファイル等が1つでもあるとフォルダが残るため、フォルダを完全削除するような仕組みとする。\\ | ||
+ | CustomActionプロジェクトを作成します。\\ | ||
+ | そして、カスタムアクション用にInstallクラスを継承する「MyInstall.vb」を作成し「CustomAction.dll」を出力します。\\ | ||
+ | 【画像挿入】\\ | ||
+ | |||
+ | 削除するか確認し、「はい」を選択したらテンポラリフォルダにコピーしたフォルダ削除バッチ(removeDir.bat)を動作させる。\\ | ||
+ | ※単純にフォルダ削除APIを実行するだけだと「CustomAction.dll」が削除できずにアンインストールエラーとなってしまう\\ | ||
+ | <code vb MyInstall.vb> | ||
+ | Imports System.ComponentModel | ||
+ | Imports System.Configuration.Install | ||
+ | Imports System.Windows.Forms | ||
+ | |||
+ | < | ||
+ | Public Class MyInstaller | ||
+ | Inherits Installer | ||
+ | |||
+ | ''' | ||
+ | ''' | ||
+ | ''' | ||
+ | Public Sub New() | ||
+ | MyBase.New() | ||
+ | End Sub | ||
+ | |||
+ | ''' | ||
+ | ''' | ||
+ | ''' | ||
+ | ''' | ||
+ | Public Overrides Sub Uninstall(savedState As IDictionary) | ||
+ | MyBase.Uninstall(savedState) | ||
+ | |||
+ | ' CustomAction.dllがあるパス取得 | ||
+ | Dim path As String = Me.Context.Parameters(" | ||
+ | ' 親ディレクトリを取得 | ||
+ | Dim parentPath As String = System.IO.Path.GetDirectoryName(path) | ||
+ | |||
+ | If parentPath.IndexOf(" | ||
+ | If System.IO.Directory.Exists(parentPath + " | ||
+ | System.IO.Directory.Exists(parentPath + " | ||
+ | |||
+ | Dim result As DialogResult = | ||
+ | MessageBox.Show(parentPath + " | ||
+ | MessageBoxButtons.YesNo, | ||
+ | |||
+ | If result = DialogResult.Yes Then | ||
+ | ' 単純にフォルダ削除するとCustomAction.dllが削除できずにアンインストールエラーとなるため | ||
+ | ' バッチファイルをテンポラリフォルダにコピーして実行させる。 | ||
+ | Dim tmpPath As String = System.IO.Path.GetTempPath() | ||
+ | Const REMOVE_BAT As String = " | ||
+ | |||
+ | System.IO.File.Copy(parentPath + " | ||
+ | |||
+ | Dim ps As New System.Diagnostics.ProcessStartInfo | ||
+ | ps.FileName = " | ||
+ | ps.Arguments = " /c " + tmpPath + REMOVE_BAT + " " + parentPath | ||
+ | ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized | ||
+ | System.Diagnostics.Process.Start(ps) | ||
+ | End If | ||
+ | End If | ||
+ | End If | ||
+ | End Sub | ||
+ | |||
+ | End Class | ||
+ | </ | ||
+ | <code bat removeDir.bat> | ||
+ | timeout 10 | ||
+ | rmdir /S /Q %1 | ||
+ | |||
+ | eixt | ||
+ | </ | ||
+ | |||
+ | ===== カスタム動作のプライマリ出力 ===== | ||
+ | 「Application Folder」を選択して右クリックメニューにある「Add」から「プロジェクト出力」を選択します。\\ | ||
+ | 【画像挿入】\\ | ||
+ | プロジェクトを「CustomAction」に変更しプライマリ出力を選択し、構成を「アクティブ」のまま「OK」ボタンをクリックします。\\ | ||
+ | 【画像挿入】\\ | ||
+ | |||
+ | この際に「removeDir.bat」のファイルも「Application Folder」に追加しておきます。 | ||
+ | |||
+ | ===== カスタム動作のセット ===== | ||
+ | Setupプロジェクトにて右クリックメニューにある「View」から「カスタム動作」を選択します。\\ | ||
+ | 【画像挿入】\\ | ||
+ | 「Custom Action」の右クリックメニューにある「カスタム動作の追加」で「プライマリ出力 from CustomAction」を選択します。\\ | ||
+ | 【画像挿入】 | ||
+ | |||
+ | ==== カスタム動作にデータを渡す ==== | ||
+ | Installの「プライマリ出力 from CustomAction」のプロパティに「CustomActionData」があります。\\ | ||
+ | {{: | ||
+ | |||
+ | CustomActionDataプロパティに「/ | ||
+ | [[https:// | ||
+ | |||
+ | 例 / | ||
+ | |||
+ | === Error 1001 === | ||
+ | 【インストール】\\ | ||
+ | インストール時に「Error 1001」によりインストールできない。\\ | ||
+ | 原因としてCustomActionDataプロパティに「/ | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | 【アンインストール】\\ | ||
+ | アンインストール時に「Error 1001 savedState 適合しないデータが含まれており...」によりインストールできない。\\ | ||
+ | |||
+ | 原因は不明、[[https:// | ||
+ | 対応として、例外エラーが出ても先に進めることを利用して例外エラーをスキップさせる。 | ||
+ | |||
+ | <code vb Uninstall> | ||
+ | Public Overrides Sub Uninstall(savedState As IDictionary) | ||
+ | Try | ||
+ | MyBase.Uninstall(savedState) | ||
+ | Catch ex As Exception | ||
+ | ' | ||
+ | End Try | ||
+ | |||
+ | Dim path As String = Context.Parameters(" | ||
+ | |||
+ | ProcessBatch(path, | ||
+ | |||
+ | End Sub | ||
+ | </ | ||
+ | ===== サービスのインストール ===== | ||
+ | 何も設定しない場合、「サービス ログインの設定」のダイアログ画面が表示される。\\ | ||
+ | {{: | ||
+ | |||
+ | これを表示しないようにするには下記の設定を行います。これによりサービスがインストールされローカルサービスアカウントで実行されます。 | ||
+ | |||
+ | - ProjectInstallerを開きます | ||
+ | - ServiceProcessInstaller1を右クリックして、プロパティを選択します | ||
+ | - [アカウント]ドロップダウンの[その他]で、サービスを実行するアカウントを選択します。 例 LocalSystem | ||
+ | |||
+ | [[https:// | ||
+ | ===== 補足 ===== | ||
+ | 違うバージョンをインストールする際に以前のバージョンをアンインストールしなくても上書きしてインストールしてくれる。 | ||
+ | |||
+ | ===== 参照 ===== | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// |
it技術/dotnet/インストーラーの作成.txt · 最終更新: 2020/10/26 10:45 by yajuadmin