WPFアプリを作り、それをインストーラーとして配布して、バージョンアップがあった時は、更新するようにしたい。
Visual Studioだとmsixがありますが、VSCodeだと手間そうなので他の方法を試してみました。
こちらの方の記事で、AutoUpdater.NETを知り試してみました!
.NET9のWPFアプリを爆速で作る アップデート編
準備
- .NET9 vscode
- Inno Setup ver6.4.1
WPFアプリ
とりあえず適当なWPFアプリを作ります。
その時にバージョン情報を入れておきます。
これを入れておかないと、バージョン情報で更新するかどうかの判定ができなくなるため。
<PropertyGroup>
~
<Version>0.3.4.0</Version>
</PropertyGroup>
Inno Setupの変更箇所
おおよそはウィザードでの初期表示そのままですが、以下を変更してみました。
1. スタートアップに追加
TasksとIconsに追記することで、スタートアップへ追加するチェックボタンを表示できる。
アプリを常駐させたい時とかに使える。
[Tasks]
Name: "startupicon"; Description: "スタートアップにショートカットを作成";
[Icons]
Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: startupicon
これだとWarningがでるので[Setup]
にPrivilegesRequired=none
を追記しておきます。
Warning: The [Setup] section directive "PrivilegesRequired" is set to "admin" but per-user areas (userstartup) are used by the script. Regardless of the version of Windows, if the installation is running in administrative install mode then you should be careful about making any per-user area changes: such changes may not achieve what you are intending. See the "UsedUserAreasWarning" topic in help file for more information.
2. 規定でチェックを入れる
- デスクトップ・スタートアップへのショートカットのTasksの所で
Flags: unchecked
を消すと規定でレ点が入ります -
checked
なのかなと思ったけどそんなのなかった
3. インストーラーの出力フォルダをissと同じ場所にする
- [Setup]で
OutputDir=.
に変更する
4. インストーラーへのバージョン情報追加
- [Setup]に
VersionInfoVersion={#MyAppVersion}
を追加する
5. アプリとインストーラーのバージョンを合わせる
- アプリ側で変更してインストーラーの方で間違いそうなので以下で対応
- アプリのバージョン情報が
1.1.1.1
のように「.」区切りの4つの数値でないと取得できないかもしれません
; パスは""ではなく''で囲む
#define MyAppPath 'mypath\path\'
#define MyAppVersion GetVersionNumbersString(MyAppPath + MyAppExeName)
[Setup]
AppVersion={#MyAppVersion}
VersionInfoVersion={#MyAppVersion}
AutoUpdater.NET
こちらの方の記事を参考にさせて頂きました。
.NET9のWPFアプリを爆速で作る アップデート編
- dotnet add package Autoupdater.NET.Officialで追加
アプリとxmlのバージョンを合わせる
アップデートはアプリ自体のバージョン情報とUpdateInfo.xmlのバージョン情報で比較されるので、この変更を間違ったらアップデートが入らなくなってしまいます。
ビルド時にバージョンを合わせるようにしてみます。
-
別でクラスライブラリをつくる
- dotnet new classlib -n VersionSyncTask
- cd VersionSyncTask
- dotnet add package Microsoft.Build.Framework
- dotnet add package Microsoft.Build.Utilities.Core
VersionSyncTask
VersionSync.csusing System.Xml.Linq; using Microsoft.Build.Framework; namespace VersionSyncTask { public class VersionSync : Microsoft.Build.Utilities.Task { [Required] public string CsprojPath { get; set; } = ""; [Required] public string XmlPath { get; set; } = ""; public override bool Execute() { try { // .csprojファイルのバージョンを取得 XDocument csprojDoc = XDocument.Load(CsprojPath); var versionElement = csprojDoc?.Root?.Element("PropertyGroup")?.Element("Version"); string version = versionElement!.Value; // UpdateInfo.xmlファイルのバージョンを更新 XDocument xmlDoc = XDocument.Load(XmlPath); var xmlVersionElement = xmlDoc.Root?.Element("version"); xmlVersionElement!.Value = version; // UpdateInfo.xmlファイルを保存 xmlDoc.Save(XmlPath); Log.LogMessage(MessageImportance.High, "バージョンが同期されました: " + version); return true; } catch (Exception ex) { Log.LogErrorFromException(ex); return false; } } } }
-
CsprojPath
とXmlPath
はcsprojから呼び出す時に指定します - dotnet publish -c Release
-
ビルドしたdllをwpfのプロジェクトへ保存する
-
UpdateInfo.xmlをwpfプロジェクトへ保存する
-
csprojへtaskを追記する
- これでプロジェクトのバージョン情報とxmlを合わせることができました
<!-- バージョンの同期 --> <UsingTask TaskName="VersionSyncTask.VersionSync" AssemblyFile="VersionSync\VersionSyncTask.dll" /> <Target Name="SyncVersion" BeforeTargets="BeforeBuild"> <VersionSync CsprojPath="$(MSBuildProjectFile)" XmlPath="VersionSync\UpdateInfo.xml" /> </Target>
-
更新したxmlファイルをビルドフォルダへコピーする
<ItemGroup> ~ <!-- ビルド時にコピーするファイル --> <None Update="VersionSync\UpdateInfo.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
インストーラーの発行
インストーラーへのコンパイルもできるように以下をつくっておきます。
コマンドパレットから、Tasks: Run Taskでつくったのを実行します。
"tasks": [
~
{
"label": "compile-inno-setup",
"type": "shell",
"command": "C:\\Program Files (x86)\\Inno Setup 6\\ISCC.exe",
"args": [
"C:\\Users\\path\\app.iss"
],
}
]