そろそろ VCのRUNTIMEをVisual Studio 2019に移行しとかないと、コンパイルできないライブラリが増えてきたかな?と思いまして、2015 から 2019 に引き上げました。
WIXを使ったインストーラで、2019用のVC runtime のマージモジュールを探したが見つかりません。
ほぇ?と思って検索したら
マージモジュールを使用したコンポーネントの再配布に書いてありました。
Visual Studio 2019 以降、Visual C++ 再頒布可能ファイルのマージ モジュールは非推奨です
Visual Studio 2019 以降、Visual C++ 再頒布可能ファイルのマージ モジュールは非推奨です
Visual Studio 2019 以降、Visual C++ 再頒布可能ファイルのマージ モジュールは非推奨です
ふぁ???
という事で、VC Runtime がインストールされているかどうかチェックが必要になりました
Wix per user installer to detect the Visual C++ 2015 Redistributableにチェック方法がありました。StackOverflowさまさまです
How to check if the Microsoft Visual C++ Runtime is installedにも詳細が記述されてましたが、こちらだとサービスパックが追加される毎に対応が必要そうで、ちょっと重たい。
という事で、
<Product ...>
...
vc runtime 2015 x86 のインストール状況プロパティ
<!-- C++ 2015 -->
<Property Id="CPPRUNTIME2015X86" Secure="yes">
<RegistrySearch Id="mfc140x86_23026" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\{74d0e5db-b326-4dae-a6b2-445b9de1836e}" Type="raw" />
<RegistrySearch Id="mfc140x86_24215" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\{e2803110-78b3-4664-a479-3611a381656a}" Type="raw" />
</Property>
vc runtime 2017 x86 のインストール状況プロパティ
<!-- C++ 2017 -->
<Property Id="CPPRUNTIME2017X86" Secure="yes">
<RegistrySearch Id="mfc1416x86" Root="HKCR" Key="Installer\Dependencies\VC,redist.x86,x86,14.16,bundle" Type="raw" />
</Property>
vc runtime 2019 x86 のインストール状況プロパティ
<!-- C++ 2019 -->
<Property Id="CPPRUNTIME2019X86" Secure="yes">
<?foreach CPPRUNTIMEVERSIONPREFIX in 21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40?>
<RegistrySearch Id="mfc14$(var.CPPRUNTIMEVERSIONPREFIX)x86" Root="HKCR" Key="Installer\Dependencies\VC,redist.x86,x86,14.$(var.CPPRUNTIMEVERSIONPREFIX),bundle" Type="raw" />
<?endforeach ?>
</Property>
vc runtime 2019 x86 がインストールされていないと、インストールを中止する条件の追加
<!-- インストール時にC++ 2019 Runtime(x86) がインストールされているかチェック -->
<Condition Message="Microsoft Visual C++ 2019 (x86) Redistributable missing">
<![CDATA[Installed Or CPPRUNTIME2019X86]]>
</Condition>
vc runtime 2015 x64 のインストール状況プロパティ
<!-- C++ 2015 -->
<Property Id="CPPRUNTIME2015X64" Secure="yes">
<RegistrySearch Id="mfc140x64_23026" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\{e46eca4f-393b-40df-9f49-076faf788d83}" Type="raw" />
<RegistrySearch Id="mfc140x64_24215" Root="HKLM" Key="SOFTWARE\Classes\Installer\Dependencies\{d992c12e-cab2-426f-bde3-fb8c53950b0d}" Type="raw" />
</Property>
vc runtime 2017 x64 のインストール状況プロパティ
<!-- C++ 2017 -->
<Property Id="CPPRUNTIME2017X64" Secure="yes">
<RegistrySearch Id="mfc1416x64" Root="HKCR" Key="Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle" Type="raw" />
</Property>
vc runtime 2019 x64 のインストール状況プロパティ
<!-- C++ 2019 -->
<Property Id="CPPRUNTIME2019X64" Secure="yes">
<?foreach CPPRUNTIMEVERSIONPREFIX in 21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40?>
<RegistrySearch Id="mfc14$(var.CPPRUNTIMEVERSIONPREFIX)x64" Root="HKCR" Key="Installer\Dependencies\VC,redist.x64,amd64,14.$(var.CPPRUNTIMEVERSIONPREFIX),bundle" Type="raw" />
<?endforeach ?>
</Property>
vc runtime 2019 x64 がインストールされていないと、インストールを中止する条件の追加
<!-- インストール時にC++ 2019 Runtime(x64) がインストールされているかチェック -->
<Condition Message="Microsoft Visual C++ 2019 (x64) Redistributable missing">
<![CDATA[Installed Or CPPRUNTIME2019X64]]>
</Condition>
vc runtime 2010 x64 のマージモジュールを追加
<Directory Id="System64Folder">
<!-- VC100 ATL Runtime -->
<Merge Id="Microsoft_VC100_ATL_x64.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_ATL_x64.msm" />
<Merge Id="Microsoft_VC100_CRT_x64.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_CRT_x64.msm" />
<Merge Id="Microsoft_VC100_MFCLOC_x64.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_MFCLOC_x64.msm" />
<Merge Id="Microsoft_VC100_MFC_x64.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_MFC_x64.msm" />
<Merge Id="Microsoft_VC100_OpenMP_x64.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_OpenMP_x64.msm" />
</Directory>
vc runtime 2010 x86 のマージモジュールを追加
<Directory Id="SystemFolder">
<!-- VC100 ATL Runtime -->
<Merge Id="Microsoft_VC100_ATL_x86.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_ATL_x86.msm" />
<Merge Id="Microsoft_VC100_CRT_x86.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_CRT_x86.msm" />
<Merge Id="Microsoft_VC100_MFCLOC_x86.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_MFCLOC_x86.msm" />
<Merge Id="Microsoft_VC100_MFC_x86.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_MFC_x86.msm" />
<Merge Id="Microsoft_VC100_OpenMP_x86.msm" Language="0" DiskId="1" SourceFile="C:/Program Files (x86)/Common Files/Merge Modules/Microsoft_VC100_OpenMP_x86.msm" />
</Directory>
vc runtime 2010 x64 と x86 のマージモジュールを参照
<Feature ...>
<!-- VC10 runtime -->
<MergeRef Id="Microsoft_VC100_ATL_x64.msm" />
<MergeRef Id="Microsoft_VC100_CRT_x64.msm" />
<MergeRef Id="Microsoft_VC100_MFCLOC_x64.msm" />
<MergeRef Id="Microsoft_VC100_MFC_x64.msm" />
<MergeRef Id="Microsoft_VC100_OpenMP_x64.msm" />
<!-- VC10 runtime -->
<MergeRef Id="Microsoft_VC100_ATL_x86.msm" />
<MergeRef Id="Microsoft_VC100_CRT_x86.msm" />
<MergeRef Id="Microsoft_VC100_MFCLOC_x86.msm" />
<MergeRef Id="Microsoft_VC100_MFC_x86.msm" />
<MergeRef Id="Microsoft_VC100_OpenMP_x86.msm" />
</Feature>
...
</Product>
というように対応できそうです。