using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace ryCommon { /// /// 运行库检测类 /// public static class RedistCheck { #region C++运行库判断模块 [DllImport("msi.dll")] private static extern INSTALLSTATE MsiQueryProductState(string product); /// /// 获取产品状态 /// /// /// private static INSTALLSTATE GetProcuct(string product) { INSTALLSTATE state = MsiQueryProductState(product); return state; } private static bool HaveInstallVc(string GUID) { if (MsiQueryProductState(GUID) == INSTALLSTATE.INSTALLSTATE_DEFAULT) { return true; } else { return false; } } private static bool HaveInstallVc(InstallBit installBit,string GUID_x86,string GUID_X64) { if (installBit == InstallBit.All) { return HaveInstallVc(GUID_x86) && HaveInstallVc(GUID_X64); } else if (installBit == InstallBit.X86) { return HaveInstallVc(GUID_x86); } else if (installBit == InstallBit.X64) { return HaveInstallVc(GUID_X64); } return false; } private static bool HaveInstallVc(InstallBit installBit, string[] GUID_x86, string[] GUID_X64) { if (installBit == InstallBit.All) { var result_x86 = false; for (int i = 0; i < GUID_x86.Length; i++) { if (HaveInstallVc(GUID_x86[i])) { result_x86 = true;break; } } var result_x64 = false; for (int i = 0; i < GUID_X64.Length; i++) { if (HaveInstallVc(GUID_X64[i])) { result_x64 = true; break; } } return result_x86 && result_x64; } else if (installBit == InstallBit.X86) { var result_x86 = false; for (int i = 0; i < GUID_x86.Length; i++) { if (HaveInstallVc(GUID_x86[i])) { result_x86 = true; break; } } return result_x86; } else if (installBit == InstallBit.X64) { var result_x64 = false; for (int i = 0; i < GUID_X64.Length; i++) { if (HaveInstallVc(GUID_X64[i])) { result_x64 = true; break; } } return result_x64; } return false; } /// /// 判断是否已安装VC运行库 /// /// private static bool IsInstall_VC(InstallBit installBit,string vcdll,double min_softver,double min_rever) { if (Environment.Is64BitOperatingSystem) { if (installBit == InstallBit.All) { var path_x64 = RyFiles.GetRealPath(@"\"+ vcdll); var path_x86 = RyFiles.GetRealPath(@"\"+ vcdll); if (System.IO.File.Exists(path_x64) && System.IO.File.Exists(path_x86)) { var ver_x64 = RySoft.GetVersionStr(path_x64); RySoft.GetVerByVerStr(ver_x64, out var _softver_x64, out var _rever_x64); var ver_x86 = RySoft.GetVersionStr(path_x86); RySoft.GetVerByVerStr(ver_x86, out var _softver_x86, out var _rever_x86); if (RySoft.CompareVer(min_softver, min_rever,_softver_x64, _rever_x64)>=0 && RySoft.CompareVer(min_softver, min_rever, _softver_x86, _rever_x86) >= 0) { return true; } } } else if (installBit == InstallBit.X86) { var path_x86 = RyFiles.GetRealPath(@"\"+ vcdll); if (System.IO.File.Exists(path_x86)) { var ver_x86 = RySoft.GetVersionStr(path_x86); RySoft.GetVerByVerStr(ver_x86, out var _softver_x86, out var _rever_x86); if (RySoft.CompareVer(min_softver, min_rever, _softver_x86, _rever_x86) >= 0) { return true; } } } else if (installBit == InstallBit.X64) { var path_x64 = RyFiles.GetRealPath(@"\"+ vcdll); if (System.IO.File.Exists(path_x64)) { var ver_x64 = RySoft.GetVersionStr(path_x64); RySoft.GetVerByVerStr(ver_x64, out var _softver_x64, out var _rever_x64); if (RySoft.CompareVer(min_softver, min_rever, _softver_x64, _rever_x64) >= 0) { return true; } } } } else { var path = RyFiles.GetRealPath(@"\"+ vcdll); if (System.IO.File.Exists(path)) { var ver_x86 = RySoft.GetVersionStr(path); RySoft.GetVerByVerStr(ver_x86, out var _softver_x86, out var _rever_x86); if (RySoft.CompareVer(min_softver, min_rever, _softver_x86, _rever_x86) >= 0) { return true; } } } return false; } /// /// 判断是否已安装VC运行库 /// /// public static bool IsInstall_VC(InstallBit installBit, string vcdll) { if (Environment.Is64BitOperatingSystem) { if (installBit == InstallBit.All) { var path_x64 = RyFiles.GetRealPath(@"\"+ vcdll); var path_x86 = RyFiles.GetRealPath(@"\"+ vcdll); if (System.IO.File.Exists(path_x64) && System.IO.File.Exists(path_x86)) { return true; } } else if (installBit == InstallBit.X86) { var path_x86 = RyFiles.GetRealPath(@"\"+ vcdll); if (System.IO.File.Exists(path_x86)) { return true; } } else if (installBit == InstallBit.X64) { var path_x64 = RyFiles.GetRealPath(@"\"+ vcdll); if (System.IO.File.Exists(path_x64)) { return true; } } } else { var path = RyFiles.GetRealPath(@"\"+ vcdll); if (System.IO.File.Exists(path)) { return true; } } return false; } /// /// 安装状态 /// private enum INSTALLSTATE { /// /// 组件禁用 /// INSTALLSTATE_NOTUSED = -7, // component disabled /// /// 配置数据已损坏 /// INSTALLSTATE_BADCONFIG = -6, // configuration data corrupt /// /// 安装已暂停或正在进行 /// INSTALLSTATE_INCOMPLETE = -5, // installation suspended or in progress /// /// 从源运行,源不可用 /// INSTALLSTATE_SOURCEABSENT = -4, // run from source, source is unavailable /// /// 返回缓冲区溢出 /// INSTALLSTATE_MOREDATA = -3, // return buffer overflow /// /// 无效的参数传递给该函数。 /// INSTALLSTATE_INVALIDARG = -2, // invalid function argument /// /// 不公布或者未安装该产品。 /// INSTALLSTATE_UNKNOWN = -1, // unrecognized product or feature /// /// 损坏 /// INSTALLSTATE_BROKEN = 0, // broken /// /// 该产品已公布但尚未安装。 /// INSTALLSTATE_ADVERTISED = 1, // advertised feature /// /// 正在移除的组件(操作状态,不可设置) /// INSTALLSTATE_REMOVED = 1, // component being removed (action state, not settable) /// /// 不同的用户安装该产品。 /// INSTALLSTATE_ABSENT = 2, // uninstalled (or action state absent but clients remain) /// /// 安装在本地驱动器上 /// INSTALLSTATE_LOCAL = 3, // installed on local drive /// /// 从源代码、CD或网络运行 /// INSTALLSTATE_SOURCE = 4, // run from source, CD or net /// /// 为当前用户安装该产品。 /// INSTALLSTATE_DEFAULT = 5, // use default, local or source } /// /// 安装的版本,是x86还是x64,还是全部安装了 /// public enum InstallBit { /// /// 判断32位和64位运行库是否已安装 /// All=0, /// ///判断32位运行库是否已安装 /// X86 = 1, /// /// 判断64位运行库是否已安装 /// X64 = 2 } #endregion /// /// 判断是否已安装VC2005运行库 /// /// public static bool IsInstall_VC2005(InstallBit installBit) { return HaveInstallVc(installBit,new string[] { "{A49F249F-0C91-497F-86DF-B2585E8E76B7}" }, new string[] { "{6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}", "{ad8a2fa1-06e7-4b0d-927d-6e54b3d31028}" }); } /// /// 判断是否已安装VC2005SP1运行库 /// /// public static bool IsInstall_VC2005SP1(InstallBit installBit) { return HaveInstallVc(installBit, "{7299052B-02A4-4627-81F2-1818DA5D550D}", "{071C9B48-7C32-4621-A0AC-3F809523288F}"); } /// /// 判断是否已安装VC2008运行库 /// /// public static bool IsInstall_VC2008(InstallBit installBit) { return HaveInstallVc(installBit,new string[] { "{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}" }, new string[] { "{350AA351-21FA-3270-8B7A-835434E766AD}", "{5FCE6D76-F5DC-37AB-B2B8-22AB8CEDB1D4}" }); } /// /// 判断是否已安装VC2008SP1运行库 /// /// public static bool IsInstall_VC2008SP1(InstallBit installBit) { return HaveInstallVc(installBit,new string[] { "{9A25302D-30C0-39D9-BD6F-21E6EC160475}", "{9BE518E6-ECC6-35A9-88E4-87755C07200F}" },new string[] { "{8220EEFE-38CD-377E-8595-13398D740ACE}" }); } /// /// 判断是否已安装VC2010运行库 /// /// public static bool IsInstall_VC2010(InstallBit installBit) { return HaveInstallVc(installBit, "{196BB40D-1578-3D01-B289-BEFC77A11A1E}", "{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}"); } /// /// 判断是否已安装VC2010SP1运行库 /// /// public static bool IsInstall_VC2010SP1(InstallBit installBit) { return HaveInstallVc(installBit, "{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}", "{1D8E6291-B0D5-35EC-8441-6616F567A0F7}"); } /// /// 判断是否已安装VC2012运行库 /// /// public static bool IsInstall_VC2012(InstallBit installBit) { return IsInstall_VC(installBit, "mfc110.dll"); } /// /// 判断是否已安装VC2013运行库 /// /// public static bool IsInstall_VC2013(InstallBit installBit) { return IsInstall_VC(installBit, "mfc120.dll"); } /// /// 判断是否已安装VC2015或以上运行库 /// /// public static bool IsInstall_VC2015(InstallBit installBit) { return IsInstall_VC(installBit, "vcruntime140.dll"); } /// /// 判断是否已安装VC2017运行库或以上运行库 /// /// public static bool IsInstall_VC2017(InstallBit installBit) { return IsInstall_VC(installBit, "vcruntime140.dll", 14.16, 27024); } /// /// 判断是否已安装VC2019运行库或以上运行库 /// /// public static bool IsInstall_VC2019(InstallBit installBit) { return IsInstall_VC(installBit, "vcruntime140.dll", 14.22, 27821); } /// /// 判断是否已安装VC2022运行库或以上运行库 /// /// public static bool IsInstall_VC2022(InstallBit installBit) { return IsInstall_VC(installBit, "vcruntime140.dll", 14.30, 30708); } /// /// 判断当前系统是否安装了WebView2组件 /// /// public static bool IsInstall_WebView2() { if (Environment.Is64BitOperatingSystem) { var result1 = RyRegedit.ExistKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry64, @"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"); var result2 = RyRegedit.ExistKey(Microsoft.Win32.RegistryHive.CurrentUser, Microsoft.Win32.RegistryView.Registry64, @"Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"); return result1 || result2; } else { var result1 = RyRegedit.ExistKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry32, @"SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"); var result2 = RyRegedit.ExistKey(Microsoft.Win32.RegistryHive.CurrentUser, Microsoft.Win32.RegistryView.Registry32, @"Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"); return result1 || result2; } } /// /// 判断当前系统是否安装了.NET 4.8 /// /// public static bool IsInstall_NET48() { if (Environment.Is64BitOperatingSystem) { return RyRegedit.ExistKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry64, @"SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.8"); } else { return RyRegedit.ExistKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Default, @"SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.8"); } } } }