RaUI/Source/MyDb/SysFuns/RedistCheck.cs
鑫Intel 966ebb0259 ### 2022-02-09更新
------
#### MyDbV4    V3.0.2202.0901
- *.[改进]新增ToNString扩展函数,支持将数字转换成小数点末尾不带0的字符串。
2022-02-11 16:56:56 +08:00

412 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace ryCommon
{
/// <summary>
/// 运行库检测类
/// </summary>
public static class RedistCheck
{
#region C++
[DllImport("msi.dll")]
private static extern INSTALLSTATE MsiQueryProductState(string product);
/// <summary>
/// 获取产品状态
/// </summary>
/// <param name="product"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 判断是否已安装VC运行库
/// </summary>
/// <returns></returns>
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(@"<sys>\"+ vcdll);
var path_x86 = RyFiles.GetRealPath(@"<sys_x86>\"+ 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(@"<sys_x86>\"+ 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(@"<sys>\"+ 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(@"<sys>\"+ 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;
}
/// <summary>
/// 判断是否已安装VC运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC(InstallBit installBit, string vcdll)
{
if (Environment.Is64BitOperatingSystem)
{
if (installBit == InstallBit.All)
{
var path_x64 = RyFiles.GetRealPath(@"<sys>\"+ vcdll);
var path_x86 = RyFiles.GetRealPath(@"<sys_x86>\"+ 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(@"<sys_x86>\"+ vcdll);
if (System.IO.File.Exists(path_x86)) { return true; }
}
else if (installBit == InstallBit.X64)
{
var path_x64 = RyFiles.GetRealPath(@"<sys>\"+ vcdll);
if (System.IO.File.Exists(path_x64)) { return true; }
}
}
else
{
var path = RyFiles.GetRealPath(@"<sys>\"+ vcdll);
if (System.IO.File.Exists(path)) { return true; }
}
return false;
}
/// <summary>
/// 安装状态
/// </summary>
private enum INSTALLSTATE
{
/// <summary>
/// 组件禁用
/// </summary>
INSTALLSTATE_NOTUSED = -7, // component disabled
/// <summary>
/// 配置数据已损坏
/// </summary>
INSTALLSTATE_BADCONFIG = -6, // configuration data corrupt
/// <summary>
/// 安装已暂停或正在进行
/// </summary>
INSTALLSTATE_INCOMPLETE = -5, // installation suspended or in progress
/// <summary>
/// 从源运行,源不可用
/// </summary>
INSTALLSTATE_SOURCEABSENT = -4, // run from source, source is unavailable
/// <summary>
/// 返回缓冲区溢出
/// </summary>
INSTALLSTATE_MOREDATA = -3, // return buffer overflow
/// <summary>
/// 无效的参数传递给该函数。
/// </summary>
INSTALLSTATE_INVALIDARG = -2, // invalid function argument
/// <summary>
/// 不公布或者未安装该产品。
/// </summary>
INSTALLSTATE_UNKNOWN = -1, // unrecognized product or feature
/// <summary>
/// 损坏
/// </summary>
INSTALLSTATE_BROKEN = 0, // broken
/// <summary>
/// 该产品已公布但尚未安装。
/// </summary>
INSTALLSTATE_ADVERTISED = 1, // advertised feature
/// <summary>
/// 正在移除的组件(操作状态,不可设置)
/// </summary>
INSTALLSTATE_REMOVED = 1, // component being removed (action state, not settable)
/// <summary>
/// 不同的用户安装该产品。
/// </summary>
INSTALLSTATE_ABSENT = 2, // uninstalled (or action state absent but clients remain)
/// <summary>
/// 安装在本地驱动器上
/// </summary>
INSTALLSTATE_LOCAL = 3, // installed on local drive
/// <summary>
/// 从源代码、CD或网络运行
/// </summary>
INSTALLSTATE_SOURCE = 4, // run from source, CD or net
/// <summary>
/// 为当前用户安装该产品。
/// </summary>
INSTALLSTATE_DEFAULT = 5, // use default, local or source
}
/// <summary>
/// 安装的版本,是x86还是x64还是全部安装了
/// </summary>
public enum InstallBit
{
/// <summary>
/// 判断32位和64位运行库是否已安装
/// </summary>
All=0,
/// <summary>
///判断32位运行库是否已安装
/// </summary>
X86 = 1,
/// <summary>
/// 判断64位运行库是否已安装
/// </summary>
X64 = 2
}
#endregion
/// <summary>
/// 判断是否已安装VC2005运行库
/// </summary>
/// <returns></returns>
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}" });
}
/// <summary>
/// 判断是否已安装VC2005SP1运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2005SP1(InstallBit installBit)
{
return HaveInstallVc(installBit, "{7299052B-02A4-4627-81F2-1818DA5D550D}", "{071C9B48-7C32-4621-A0AC-3F809523288F}");
}
/// <summary>
/// 判断是否已安装VC2008运行库
/// </summary>
/// <returns></returns>
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}" });
}
/// <summary>
/// 判断是否已安装VC2008SP1运行库
/// </summary>
/// <returns></returns>
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}" });
}
/// <summary>
/// 判断是否已安装VC2010运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2010(InstallBit installBit)
{
return HaveInstallVc(installBit, "{196BB40D-1578-3D01-B289-BEFC77A11A1E}", "{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}");
}
/// <summary>
/// 判断是否已安装VC2010SP1运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2010SP1(InstallBit installBit)
{
return HaveInstallVc(installBit, "{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}", "{1D8E6291-B0D5-35EC-8441-6616F567A0F7}");
}
/// <summary>
/// 判断是否已安装VC2012运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2012(InstallBit installBit)
{
return IsInstall_VC(installBit, "mfc110.dll");
}
/// <summary>
/// 判断是否已安装VC2013运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2013(InstallBit installBit)
{
return IsInstall_VC(installBit, "mfc120.dll");
}
/// <summary>
/// 判断是否已安装VC2015或以上运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2015(InstallBit installBit)
{
return IsInstall_VC(installBit, "vcruntime140.dll");
}
/// <summary>
/// 判断是否已安装VC2017运行库或以上运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2017(InstallBit installBit)
{
return IsInstall_VC(installBit, "vcruntime140.dll", 14.16, 27024);
}
/// <summary>
/// 判断是否已安装VC2019运行库或以上运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2019(InstallBit installBit)
{
return IsInstall_VC(installBit, "vcruntime140.dll", 14.22, 27821);
}
/// <summary>
/// 判断是否已安装VC2022运行库或以上运行库
/// </summary>
/// <returns></returns>
public static bool IsInstall_VC2022(InstallBit installBit)
{
return IsInstall_VC(installBit, "vcruntime140.dll", 14.30, 30708);
}
/// <summary>
/// 判断当前系统是否安装了WebView2组件
/// </summary>
/// <returns></returns>
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;
}
}
/// <summary>
/// 判断当前系统是否安装了.NET 4.8
/// </summary>
/// <returns></returns>
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");
}
}
}
}