多数のバージョンのVisual C++ Redistributableがインストールされている場合について
下図のように、いつの間にか多数のバージョンのVisual C++ Redistributableがインストールされていることがあります。アプリケーションによって必要としているVisual C++のバージョンは異なる場合があり、2015以降を除けばメジャーバージョンが異なる場合は互換性がないため、同じマシンに複数のバージョンをインストールすることは一般的です。基本的に無視して問題はなく、完全に必要ないことが確認できている場合を除いてアンインストールしない方が無難です。
Visual C++ 2005, 2008
この時代のVisual C++は、Windowsのside-by-sideアセンブリという仕組みでコンポーネントが管理されていました。これは異なるバージョンのDLLが上書きされてアプリが壊れる「DLL Hell」を防ぐメリットがありましたが、仕組みの複雑さやアプリケーション側の構成ミスなどで問題が生じるケースが多かったことや、ライブラリ自体のバージョン間の互換性が高まったことなどにより、Visual C++ 2010以降はこの仕組みを使用しなくなりました。
side-by-sideアセンブリはC:\windows\system32フォルダーではなくC:\windows\winsxsフォルダーに格納されます。例えばC:\Windows\WinSxS\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.9680_none_88e394a52fab6222
やC:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9635_none_08e2c157a83ed5da
といった具合です。
また、アプリケーション側ではマニフェストに依存関係のバージョンを指定した上で、実行するためにはマニフェストと一致するバージョンのランタイムの配置が必要でした。ただし、最近のWindowsのバージョンにはVisual C++ 2005やVisual C++ 2008相当の一部のランタイムファイルが既定でインストールされており、同時にバージョンのポリシーがレジストリに設定されています。これにより、アプリケーションが特定のバージョンのランタイムを要求していない場合は、既定でインストールされているバージョンが使用されます。
Visual C++ 2010, 2012, 2013
Visual C++ 2010以降は、side-by-sideアセンブリの仕組みを使用しなくなりました。モジュールはC:\windows\system32フォルダーやC:\windows\syswow64フォルダーにインストールされ、同じメジャーバージョン内では新しいバージョンが古いバージョンを置き換える形で更新されます。例えば Visual C++ 2010 RedistributableとVisual C++ 2010 SP1 Redistributableをインストールした場合、より新しい後者のファイルで上書きされます。もしコントロールパネルに両方が表示されていても、実際には最新バージョンのファイルで動作しますので問題ありません。
ただし、メジャーバージョンが異なる場合は互換性がないため、同じマシンに複数のバージョンが共存する形でインストールされます。例えば、Visual C++ 2010 RedistributableとVisual C++ 2012 Redistributableを同時にインストールした場合、C:\windows\system32フォルダー配下にはmsvcr100.dllとmsvcr110.dllといったバージョン毎に異なるファイル名のランタイムファイルが配置され、上書きされることはありません。アプリケーションもそれぞれのバージョンに対応したランタイムファイルを参照するため、特定のバージョンのランタイムが必要なアプリケーションは、必要なバージョンのVisual C++ Redistributableをインストールする必要があります。また、新しいメジャーバージョンがインストールされているからといって古いバージョンをアンインストールしてしまうと、古いメジャーバージョンに依存するアプリケーションが動作しなくなってしまうため注意が必要です。
Visual C++ 2015以降
Visual C++ 2015以降は、メジャーバージョン間でも互換性が保たれるようになりました。Visual C++ 2015以降は、新しいメジャーバージョンは古いメジャーバージョンに対して互換性があり、同じランタイムファイルを使用します。例えば、Visual C++ 2015 RedistributableとVisual C++ 2017 Redistributableは、vcruntime140.dllという同じファイル名のランタイムファイルを使用します。このため、Visual C++ 2015以降のバージョンは、新しいバージョンが古いバージョンを上書きする形で更新されます。例えば、Visual C++ 2015 Redistributableをインストールした後にVisual C++ 2017 Redistributableをインストールすると、vcruntime140.dllはVisual C++ 2017のバージョンに更新されます。複数のメジャーバージョンがコンピューター上に共存することはできません。
アプリケーション開発者向け
Visual C++ Redistributableは様々なアプリケーションで使用されており、それらのインストールに伴ってVisual C++ Redistributableも新しいバージョンに更新される可能性があります。そのため、アプリケーション開発者は自分のアプリケーションを動作させるためにVisual C++ Redistributableの特定のバージョンを要件とするべきではありません。新しいバージョンがインストールされている場合は要件を満たしているものとして扱うべきです。もし特定のバージョンが必要な場合は、アプリケーションと同じフォルダーにランタイムファイルを配置する形態とするか、ランタイムライブラリをスタティックリンクする必要があります。
脆弱性スキャナーが古いバージョンを検知した場合の対応
Visual C++ 2005や2008といった古いバージョンは既にサポートを終了しているため、セキュリティ修正が提供されていません。そのため、脆弱性スキャナーはこれらの古いバージョンを検知した場合、脆弱性があると判断することがあります。このような場合は、以下の対応を検討してください。
-
古いバージョンを使用しているアプリケーションを特定する(参考情報:Visual C++ ランタイム バージョンの使用状況を監査する方法)。
-
アプリケーションが不要な場合はアンインストールする
-
アプリケーションが必要な場合は、アプリケーションの開発元に問い合わせて、最新のVisual C++ Redistributableに対応したバージョンが提供されているか確認する
-
古いバージョンを使用しているアプリケーションがなくなったら、古いバージョンのVisual C++ Redistributableをアンインストールする