Contents
こんにちは、へっぽこ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関連要素をまとめていますので、よければ一覧記事もご覧ください。