🐿️

[Office] VSTOアドインをmsiで配布する

2024/07/30に公開

はじめに

この記事ではMicrosoft Visual Studio Installer Projects 2022を使ったMicrosoft Office向けVSTOアドインプロジェクト配布用のmsiインストーラの作成方法を記載します。
なお、証明書は付けません。また、Office PIAを利用するレベルのアドインは想定せず、単一のアプリ(例えばExcelなど)用のアドインについてまとめます。

基本は公式ドキュメントの通りなのですが、結構長いので自分なりにまとめてみましたので、比較して活用していただければ幸いです。

VSTOアドインとは

VSTOアドインとは、.NET Frameworkを利用してExcelなどのOfficeの拡張機能が開発できるテクノロジです。
端的に言えばVSCodeでいう拡張プラグインです。VBAのようなことやより複雑なことをC#やVB.NETで、VBAマクロとして組み込まずにアプリのリボンを生やせたり出来ます。後発にWeb技術をメインとしたOfficeアドインがあり、レガシーなものになりますが、それ故古いOfficeアプリでも活用できる為、依然としてそれなりに活用性がある技術だと思います。ここではそれについては詳細を記載しません。

(補足) 単なる「発行」による配布

ググると結構引っかかった簡易な方法について記載します。
この方法は出力されたsetup.exeを実行したら、そのフォルダにあるvstoを直参照するようにインストールを行います。テストや少人数の内輪利用程度またはClick Onceでの配布であれば問題ないかもしれませんが、デメリットとして、配布時はユーザに例えばフォルダを固定位置に置いてもらうような運用にする必要があり、アンインストールなどもひと手間かかってしまうため、その点は考慮する必要があります。

  • 対象アドインプロジェクトを右クリックして「発行」を選択する
  • 公開ウィザードで「CD-ROM/DVD-ROM」を選択する
  • 公開フォルダを設定する(デフォルトは「公開」)
    • この値はプロジェクトプロパティの「公開」から変更可能
  • 進んでいくとルートディレクトリの「公開」ディレクトリにセットアップ用の実行ファイルおよびアセンブリ一式が作成される
  • 作成した公開ディレクトリを配布する。setup.exeを実行するとインストールが行われる

前提条件

  • Windows 10~
  • Microsoft Office 2013~(主にExcelを想定)
  • Visual Studio 2022
  • Office VSTOアドインプロジェクトが作成されているソリューション

方法

以下からの詳しい解説はMSドキュメントにあります。
この方法を使うと、他のアプリと同じようにC:\Program Filesのような場所に置かれるので、利用者は普通のアプリと同じようにインストーラ実行でインストール・「プログラムの追加と削除」を使いアンインストールを行うことができます。

環境構築

Visual Studioの拡張機能 > 拡張機能の管理からMicrosoft Visual Studio Installer Projects 2022をインストールし、Visual Studioを再起動します。(Visual Studio 2022時点)

インストーラのプロジェクトを作成

ソリューションにプロジェクトを追加します。
「Microsoft Visual Studio Installer Projects 」が提供するSetup Projectテンプレートを追加し、FooAddInSetupなどのように命名します

セットアッププロジェクトを追加

  • 作成したインストーラプロジェクトを右クリックしてAdd > プロジェクト出力グループの追加で作成済みのアドインプロジェクトを選択します
  • プライマリ出力および構成にReleaseを設定して追加します。

マニフェストを追加

  • アドインプロジェクトをReleaseで一度ビルドします
  • インストーラプロジェクトを右クリックしてAdd > ファイルでビルドした**.dll.manifest**.vstoを参照に追加します

依存コンポーネントの追加と除外

インストーラプロジェクトを右クリックしたコンテクストメニューからプロパティを選択して開いたウインドウでPreRequirementsから以下をチェックします

  • Microsoft.NET Framework 4.x.x(アドインプロジェクトのターゲットフレームワーク)
  • Microsoft Visual Studio 2010 Tools for Office Runtime

ソリューションエクスプローラでインストーラプロジェクトのDetected Dependenciesを確認し、Mirosoft.Office.Tools.Common.vXX.Utilities.dll以外のすべての*.dllを右クリックして除外をクリックします。

ここまででソリューションエクスプローラは以下画像のような形になります。

レジストリの構成

インストーラプロジェクトを右クリックして、View > レジストリを選びます。
これはOfficeアプリがアドインを検出するために必須な項目になります。

デフォルトで設定されている以下2つを削除します。

  • HKEY_LOCAL_MACHINE\SoftwareにあるManufacturer
  • HKEY_LOCAL_MACHINE\SoftwareにあるManufacturer

次にUser/Machine Hiveキー階層を追加していきます。
最終的に以下のようになるようにします。
Office application nameとは、例えばExcelならExcelです。

User/Machine Hive\Software\Microsoft\Office\[Office application name]l\Addins\[add-in ID]

そこに4つの値を追加し、プロパティタブF4)から設定を行います

Name 設定値
Description String 任意の説明
FriendlyName String アドイン名として設定したい名称
LoadBehavior DWORD 3
Manifest String file:///[TARGETDIR]<name>.vsto|vstolocal

最終的には一例として以下画像のような形になります。

起動条件の構成

セットアッププロジェクトを右クリックして、View > 起動条件を選びます。

以下の操作をプロパティタブF4)から行います。

レジストリの起動条件の編集

Search Target Machineレジストリの起動条件の追加で以下を追加します。

Key Value
(Name) Search for Office VSTO Runtime
Property OFFICERUNTIME
RegKey SOFTWARE\Microsoft\VSTO Runtime Setup\v4
Root vsdrrHKLM
Value Version

同様に、Search Target Machineレジストリの起動条件の追加で以下を追加します。

Key Value
(Name) Search for VSTO 2010 Runtime
Property VSTORUNTIMEREDIST
RegKey SOFTWARE\Microsoft\VSTO Runtime Setup\v4R
Root vsdrrHKLM
Value Version

起動条件の編集

Launch Conditions起動条件の追加で以下を追加または編集します

Key Value
(Name) Verify VSTO 2010 Runtime availability
Condition VSTORUNTIMEREDIST >="10.0.30319" OR OFFICERUNTIME>="10.0.21022"
InstallUrl (空)
Message The Visual Studio 2010 Tools for Office Runtime is not installed. Please run Setup.exe to install the Add-in

配置プロパティの編集

インストーラプロジェクトを選択(またはF4)してプロパティタブを開き、以下などを任意で設定します

Property 説明
Author 作者名
Description 説明
Manufacturer 作成者。ここの名前がインストール時のProgramFiles\XXXX\YYYYのXXXXに相当する。基本は組織名など
ProductName 製品名。ここの名前がインストール時のProgramFiles\XXXX\YYYYのYYYYに相当する
TargetPlatform ターゲットプラットフォーム。基本はx64で良いでしょう

ビルドする

構成をReleaseに設定してからインストーラプロジェクトを選択し、右クリックからビルドを選択することで「Release」フォルダに「setup.exe」と「XXX.msi」が出力されます。

あとはそのフォルダをリネームしてzipなどにすれば、基本的に色々な人が使える形に配布できます。

Discussion