【Windows】インストーラーの問題【Visual Studio 2022】

先週1週間、ほぼ開発ではなくインストーラーの作成に時間がとられていた。

というのもインストーラーを作れるプロジェクトはVisual Studioでいくつかある。
Windowsの30年以上にわたる長い歴史で作られては消され作られては消されてきた。

作ろうと思えば作れるが作りたくない。
Microsoft storeに登録しようとするとMSIXでインストールできることが必須らしい。

今回のプロジェクトの構成として大きいのはWindowsサービスが入っていること。
インストーラーでインストールした直後にWindowsサービスを登録して起動してもらう必要がある。
さらにネットワーク環境でUDP/TCPを使うのでWindows Firewallに登録してもらう必要もある。

結論から言うとwix v5で作ったMSIファイル
・Program filesにファイルがインストール
・サービスのインストールおよび起動
・ファイアウォールを登録
サービスからアプリケーションが実行されていることが確認できた。

さて、ここからは愚痴だ。

Visual Studioにおそらく標準で入っているのが
Setup Project
GUIでサポートしてくれるがデバッグ実行もできないしサービスも起動してくれなかった。
入ったようで入っていない。
もちろんFirewallなんて登録もされない。

次に候補として出てきたのが
wix
これをVisual Studioの拡張ツールで検索すると出てくるのはwix v3
拡張機能以外にも.netからビルダーをインストールしろと出てくる。

dotnet tool install --global wix

これでインストールされるのはwix v5だ!
wix v3で作ったプロジェクトのwxsファイルなど通るはずもなかろう!!!
wix v3wix v4の間にはウルガラン山脈より高く永久焦土地帯よりも広い境界が存在するのだ!
なのにwix v4とwix v5の間はアクエリオン以上の親和性が!(1話しか見てない)

まずwix v5を使うために上記のdotnet tool installでのインストールと
拡張機能の管理からwix・・・ではなく
HeatWave for 2022が必要だ!(この情報だけで2時間ぐらいかかった。)
どこにもwixなんて要素はないが、wix v4/v5用の拡張機能はこれだ!
v3からコンバートもしてくれるぜ!(うまくいくかは別)

ということで作ったv5のxmlがこれ。
Featureタグの中で実際にComponentで指定されたのを実行する。
つまりComponentを複数に分ければ
ファイルのインストール→ファイアウォールの設定→管理者権限の登録→サービスの登録→サービスの起動
とか分けたりできるが・・・。
うまくいかんかった。

Component一個でその中で順番にファイルのインストール→サービスのインストール→起動でよかったっぽい。
しかもファイアウォールとかxmlns:fire=”http://wixtoolset.org/schemas/v4/wxs/firewall”を入れただけで勝手に登録してくれた。
(というかUAC出たのがそうなのかも。)
難しいこと考えなくてよかったね。

<?xml version="1.0" encoding="UTF-8"?>

<?define Name = "{Service Name}" ?>
<?define Manufacturer = "{Manufacturer}" ?>
<?define Version = "1.0.0.0" ?>
<?define UpgradeCode = "{GUID-1}" ?>

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:fire="http://wixtoolset.org/schemas/v4/wxs/firewall">
	<Package Name="$(Name)"
             Manufacturer="$(Manufacturer)"
             Version="$(Version)"
             UpgradeCode="$(var.UpgradeCode)"
             Compressed="true">
		<MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />
		<StandardDirectory Id="ProgramFiles64Folder">
			<Directory Id="ROOTDIRECTORY" Name="$(var.Manufacturer)">
				<Directory Id="INSTALLFOLDER" Name="{Name}" />
			</Directory>
		</StandardDirectory>
		<DirectoryRef Id="INSTALLFOLDER">
			<Component Id="ServiceExecutable" Bitness="always64" Guid="{GUID-2}">

				<File Id="{インストールするファイル1}"
                      Source="$(var.{Service Name}.TargetDir){ファイル名}"
                      KeyPath="false" />
				<File Id="{インストールするファイル2}"
                      Source="$(var.{Service Name}.TargetDir){ファイル名}"
                      KeyPath="false" />
				<File Id="{サービスとして実行するexe}"
                      Source="$(var.{Service Name}.TargetDir){ファイル名}"
                      KeyPath="true" />

				<RemoveFile Id="ALLFILES" Name="*.*" On="both" />

				<ServiceInstall Id="ServiceInstaller"
                                Type="ownProcess"
                                Name="{名前}"
                                DisplayName="$(Name)"
                                Description="{説明}"
                                Start="auto"
                                ErrorControl="normal" />

				<ServiceControl Id="StartService"
                                Start="install"
                                Stop="both"
                                Remove="uninstall"
                                Name="{名前}"
                                Wait="false" />
			</Component>
		</DirectoryRef>

		<Feature Id="Service" Title="{Title}" Level="1">
			<ComponentRef Id="ServiceExecutable" />
		</Feature>

</Package>
</Wix>

 

でも必要なのはMSIじゃなくてMSIXだよね?
安心してください!

MSIをMSIXにするパッキングツールってのがあるんですよ!
https://learn.microsoft.com/ja-jp/windows/msix/packaging-tool/tool-overview


これを手順通り、まずこの青いボタンを押して・・・。

(┛◉Д◉)┛彡┻━┻

PS C:\> winget install "MSIX Packaging Tool"

これでいけました。スタートにも登録されているのでこれで変換してみたんですが、
署名が空っぽなのでインストールの確認はできていません。。。
99$必要なのかな?

おまけ。
最近全然聞かないインストールシールドってのもあるんだけど
値段見て眩暈したよね。。。
https://shop.xlsoft.com/products_search.php?manf=21

コメント

タイトルとURLをコピーしました