InstallShieldはVisual Studio Installer Projectsを救ってた

こんにちは、へっぽこSEアシアです。
今日も、ニッチなWindowsアプリ開発の話をします。

過去、Visual Studio 2015 + InstallShield でWindowsアプリを開発してインスーラを配布してた。
InstallShieldが入ったPCがお亡くなりになったタイミングで、環境ごと見直すことに。
Visual Studio 2019に、拡張機能Visual Studio Installer Projectsをインストールして、各種設定して配布。
ちゃんと動いているし、良きかなーって思ってた。

ちなみに作っている環境はこんな感じ。

  • C# で複数のDLLを32bit用に作ってた
  • うち1つをVBA側から使う窓口にしてた
    • プロジェクトプロパティの「COM相互運用機能の登録」にはチェックを入れている
    • インストーラ作成プロジェクトでは対象DLLの「Register」に「vsdrpCOM」を指定
    • Visual Studioは管理者権限で起動してビルド

ところが、新人が参画して、使う分には問題がなかったのに、じゃあ開発しようか、となったら、問題が発生。

問題は2つ

まず、ビルドでWARNINGが出る、と。

WARNING: Unable to create registration information for file named '作ったDLL名.tlb'

そして、ビルド自体は成功するので、そのまま進めても、作成したDLLのパスが書き換わらない、と。
ビルドすると、VBAの参照設定から見える「場所」が、ビルドの出力パス(~~\bin\Debug\~.tlb)になるかと思います。
これが、インストーラでインストール先に書き換わるはずが、書き換わらん、と。
でも私が作ったインストーラなら書き換わる、らしい。

状況を整理してみた

RegisterをvsdrpCOM→vsdrfCOMSelfRegにすると、警告は消えるが、私の環境でもパスが書き換わらなくなっちゃうのでナシ。
Windows Vistaあたりから出ている問題らしいというが?
色々調べた結果、こういうことらしい。

Install Shield版未経験の開発環境でビルドすると

  • WARNING: Unable to create registration information for file named ‘hogehoge.tlb’が出る
  • 管理者権限のVisual Studioでビルドすることで HKEY_CLASSES_ROOT\TypeLib… を書き換える
  • が、作成したインストーラには上記を書き換える力はなく、HKEY_LOCAL_MACHINE\SOFTWARE… にtlbファイルパスを登録する
  • Excelからtlbを見るときは、HKEY_CLASSES_ROOT\TypeLib… のパスを優先する
  • レジストリから削除するとMouseExcel自体が相互参照から消えてしまうので、ROOTがなければLOCALを見る、という単純な優先順位の話ではなさそう

Install Shield版をインストールすると、

  • HKEY_CLASSES_ROOT\TypeLib… も HKEY_LOCAL_MACHINE\… も登録する
  • Visual Studioの環境が整い、WORNINGも消えるし、作成したインストーラーも HKEY_CLASSES_ROOT\TypeLib… を書き換える力が付与される(いや、なんでや?)

つまり解決方法は

開発・検証・配布先のすべてを一斉にInstall Shield未経験にするとBest。
とはいえ、tlbパスが変化するのは開発端末だけ。
少なくとも開発端末は一斉にInstall Shield未経験に揃える必要がある。

ので、今回は私と新人君でInstallShield時代のインストール経験の差が出ていることが問題。
なので、新人君にはInstallShield時代のインストーラを実行してもらって解決しました。

余談

なお、InstallShieldかVisual Studio Installer Projectsかで、こんな問題が起こったりもします。

し、64bit版に移行しよう!となるとまたこの問題がぶり返しそう。
そうなるとInstallShield云々の回避策は使えなくて、カスタム動作でRegAsmを叩くのが良さそう。
その話も近日中にまとめたい。


他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)