• 检测客户pc电脑端VC++环境并安装


    CefSharp 是一个非常不错的cef封装。但它依赖于VC++环境。

    具体如下:

    BranchCEF VersionVC++ Version.Net VersionStatus
    master 3202 2013 4.5.2 Development
    cefsharp/62 3202 2013 4.5.2 Pre-Release
    cefsharp/57 2987 2013 4.5.2 Release
    cefsharp/55 2883 2013 4.5.2 Unsupported
    cefsharp/53 2785 2013 4.5.2 Unsupported
    cefsharp/51 2704 2013 4.5.2 Unsupported
    cefsharp/49 2623 2013 4.0 Unsupported
    cefsharp/47 2526 2013 4.0 Unsupported
    cefsharp/45 2454 2013 4.0 Unsupported
    cefsharp/43 2357 2012 4.0 Unsupported
    cefsharp/41 2272 2012 4.0 Unsupported
    cefsharp/39 2171 2012 4.0 Unsupported
    cefsharp/37 2062 2012 4.0 Unsupported
     

    于是我们在初始化cef前需要先检测vc++环境情况。

    通过检测注册表方式,具体实现代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public static bool IsInstallVc2013x86()
           {
               try
               {
                   Microsoft.Win32.RegistryKey uninstallNode = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionUninstall");
     
                   foreach (string subKeyName in uninstallNode.GetSubKeyNames())
                   {
                       Microsoft.Win32.RegistryKey subKey = uninstallNode.OpenSubKey(subKeyName);
                       object BundleProviderKey = subKey.GetValue("BundleProviderKey");
                       if (BundleProviderKey != null)
                       {
                           //HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionUninstall{ 5e4b593b - ca3c - 429c - bc49 - b51cbf46e72a}
                           //HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionUninstall{13A4EE12-23EA-3371-91EE-EFB36DDFFF3E} 中文版本
                           if (BundleProviderKey.ToString() == "{5e4b593b-ca3c-429c-bc49-b51cbf46e72a}")
                           {
                               return true;
                               // MessageBox.Show(displayName.ToString());  
                           }
                           //if (BundleProviderKey.ToString() == "{f65db027-aff3-4070-886a-0d87064aabb1}")  英文版
                           //{
                           //    return true;
                           //    // MessageBox.Show(displayName.ToString());  
                           //}
                       }
                   }
               }
               catch (Exception ex)
               {
     
                   //LogTextHelper.Error(ex);
               }
     
               return false;
           }

      

    当为检测到未安装时,提示用户安装。

    用户选择确认后,以管理员方式执行安装文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    private static bool InitVc2013x86()
    {
        try
        {
            if (!IsInstallVc2013x86())
            {
                //http://www.microsoft.com/zh-cn/download/details.aspx?id=40784
     
                //LogTextHelper.Error("系统未安装Vc2013x86组件");
     
                Splasher.Show(typeof(frmSysSplash));
     
                Splasher.Status = string.Format("首次使用,正在检测系统组件...");
                System.Threading.Thread.Sleep(10000);
     
                Splasher.Close();
     
                MessageUtil.ShowTips("检测到您的机器未安装Microsoft Visual C++ 2013运行组件,系统将为您自动安装。");
     
                Splasher.Show(typeof(frmSysSplash));
                Splasher.Status = string.Format("正在安装系统组件,请耐心等待...");
     
     
                int duration = 10000;
                System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
                stopwatch.Start(); //  开始监视代码运行时间
                string installMessage = string.Empty;
                bool installSucces = InstallVc2013x86(out installMessage);
                stopwatch.Stop(); //  停止监视
                if (installSucces)//安装成功
                {
                    if (stopwatch.Elapsed.TotalMilliseconds < duration)
                    {
                        int total = duration - (int)stopwatch.Elapsed.TotalMilliseconds;
                        int step = 30;
                        while (true)
                        {
                            System.Threading.Thread.Sleep(200);
                            Splasher.Status = string.Format("当前进度{0}%...", 100 * step / total);
                            step += 200;
                            if (step > total)
                            {
                                break;
                            }
                        }
                    }
     
                    Splasher.Status = string.Format("操作完成!正在验证安装...");
                    System.Threading.Thread.Sleep(3000);
                    Splasher.Close();
     
                    if (!IsInstallVc2013x86())//校验安装
                    {
                        if (MessageBox.Show("自动安装失败!您可以尝试以管理员身份重新打开或从以下网站手动下载安装。(http://www.microsoft.com/zh-cn/download/details.aspx?id=40784)""提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                        {
                            System.Diagnostics.Process.Start("http://www.microsoft.com/zh-cn/download/details.aspx?id=40784");
                        }
                        return false;
                    }
                    return true;
                }
                else
                {
                    Splasher.Close();
                    MessageUtil.ShowTips(installMessage);
                    return false;
                }
            }
     
            //LogTextHelper.Error("已安装环境");
            return true;
        }
        catch (Exception ex)
        {
            //LogTextHelper.Error(ex);
        }
        return false;
    }
     
     
    public static bool InstallVc2013x86(out string message)
    {
        message = string.Empty;
        string fileName = System.IO.Path.Combine(Application.StartupPath, "vcredist_x86\vcredist_x86.exe");
        if (!System.IO.File.Exists(fileName))
        {
            //LogTextHelper.Info("未找到文件 " + fileName);
            message = "未找到文件" + fileName;
            return false;
        }
     
        /**
      * 当前用户是管理员的时候,直接启动应用程序
      * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
      */
        //获得当前登录的Windows用户标示
        System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
        System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
     
        //LogTextHelper.Info("开始安装 InstallVc2013x86");
        //判断当前登录用户是否为管理员
        if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
        {
            //LogTextHelper.Info("当前身份为管理员");
            //LogTextHelper.Info("管理员方式运行");
            //LogTextHelper.Info("开始安装 InstallVc2013x86");
            System.Diagnostics.Process.Start(fileName).WaitForExit();
        }
        else
        {
            //LogTextHelper.Info("管理员方式运行");
            //LogTextHelper.Info("开始安装 InstallVc2013x86");
            //创建启动对象
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            //设置运行文件
            startInfo.FileName = fileName;
            //设置启动参数
            //startInfo.Arguments = String.Join(" ", Args);
            //设置启动动作,确保以管理员身份运行
            startInfo.Verb = "runas";
            //如果不是管理员,则启动UAC
     
            System.Diagnostics.Process.Start(startInfo).WaitForExit();
        }
        return true;
    }

      

    应用程序入口:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
     
        InitPlugins();
        if (!InitVc2013x86())
        {
            return;
        }
        if (!InitCef())
        {
            MessageUtil.ShowError("主界面初始化失败!");
            return;
        }
        Application.Run(new FrmFirst());
    }

      

    附录vc++各版本 检查方法:

    Visual C++ 2005

    Microsoft Visual C++ 2005 Redistributable (x64)
    Registry Key: HKLMSOFTWAREClassesInstallerProducts1af2a8da7e60d0b429d7e6453b3d0182
    Configuration: x64
    Version: 6.0.2900.2180

    Direct Download URL: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.EXE

    Microsoft Visual C++ 2005 Redistributable (x86)
    Registry Key: HKLMSOFTWAREClassesInstallerProductsc1c4f01781cc94c4c8fb1542c0981a2a 
    Configuration: x86
    Version: 6.0.2900.2180

    Direct Download URL: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.EXE


    Visual C++ 2008

    Microsoft Visual C++ 2008 Redistributable (x64)
    Registry Key: HKLMSOFTWAREClassesInstallerProducts67D6ECF5CD5FBA732B8B22BAC8DE1B4D 
    Configuration: x64
    Version: 9.0.30729.5677

    Direct Download URL: https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe

    Microsoft Visual C++ 2008 Redistributable (x86)
    Registry Key: HKLMSOFTWAREClassesInstallerProducts6E815EB96CCE9A53884E7857C57002F0
    Configuration: x86
    Version: 9.0.30729.5677

    Direct Download URL: https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe


    Visual C++ 2010

    Microsoft Visual C++ 2010 Redistributable (x64)
    Registry Key: HKLMSOFTWAREClassesInstallerProducts1926E8D15D0BCE53481466615F760A7F 
    Configuration: x64
    Version: 10.0.40219.325

    Direct Download URL: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe

    Microsoft Visual C++ 2010 Redistributable (x86)
    Registry Key: HKLMSOFTWAREClassesInstallerProducts1D5E3C0FEDA1E123187686FED06E995A 
    Configuration: x86
    Version: 10.0.40219.325

    Direct Download URL: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe


    Visual C++ 2012

    Microsoft Visual C++ 2012 Redistributable (x64)
    Registry Key: HKLMSOFTWAREClassesInstallerDependencies{ca67548a-5ebe-413a-b50c-4b9ceb6d66c6} 
    Configuration: x64
    Version: 11.0.61030.0

    Direct Download URL: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe

    Microsoft Visual C++ 2012 Redistributable (x86)
    Registry Key: HKLMSOFTWAREClassesInstallerDependencies{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f} 
    Configuration: x86
    Version: 11.0.61030.0

    Direct Download URL: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe


    Visual C++ 2013

    Microsoft Visual C++ 2013 Redistributable (x64)
    Registry Key: HKLMSOFTWAREClassesInstallerDependencies{050d4fc8-5d48-4b8f-8972-47c82c46020f} 
    Configuration: x64
    Version: 12.0.30501.0

    Direct Download URL: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe

    Microsoft Visual C++ 2013 Redistributable (x86)
    Registry Key: HKLMSOFTWAREClassesInstallerDependencies{f65db027-aff3-4070-886a-0d87064aabb1} 
    Configuration: x86
    Version: 12.0.30501.0

    Direct Download URL: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe


    Visual C++ 2015

    Microsoft Visual C++ 2015 Redistributable (x64) - 14.0.24215
    Registry Key: HKEY_LOCAL_MACHINESOFTWAREClassesInstallerDependencies{d992c12e-cab2-426f-bde3-fb8c53950b0d}
    Configuration: x64
    Version: 14.0.24215.1

    Direct Download URL: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe

    Microsoft Visual C++ 2015 Redistributable (x86) - 14.0.24215
    Registry Key: HKEY_LOCAL_MACHINESOFTWAREClassesInstallerDependencies{e2803110-78b3-4664-a479-3611a381656a}
    Configuration: x86
    Version: 14.0.24215.1

    Direct Download URL: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe


    Visual C++ 2017

    Caveat: There's either a new 2017 registry convention being used, or it hasn't been finalized, yet. As I'm guessing the upper-most keys of: [HKEY_CLASSES_ROOTInstallerDependencies\,,amd64,14.0,bundle] and [HKEY_CLASSES_ROOTInstallerDependencies\,,x86,14.0,bundle]

    are subject to change, or at least have different nested GUIDs, I'm going to use list the key that ends with a GUID.

    Microsoft Visual C++ 2017 Redistributable (x64) - 14.11.25325
    Registry Key: [HKEY_CLASSES_ROOTInstallerDependencies\,,amd64,14.0,bundleDependents{6c6356fe-cbfa-4944-9bed-a9e99f45cb7a}]
    Configuration: x64
    Version: 14.11.25325.0

    Direct Download URL: https://download.visualstudio.microsoft.com/download/pr/11100230/15ccb3f02745c7b206ad10373cbca89b/VC_redist.x64.exe

    Microsoft Visual C++ 2017 Redistributable (x86) - 14.11.25325
    Registry Key: [HKEY_CLASSES_ROOTInstallerDependencies\,,x86,14.0,bundleDependents{404c9c27-8377-4fd1-b607-7ca635db4e49}]
    Configuration: x86
    Version: 14.11.25325.0

    Direct Download URL: https://download.visualstudio.microsoft.com/download/pr/11100229/78c1e864d806e36f6035d80a0e80399e/VC_redist.x86.exe


    Changelog
    September 8th, 2017 -- Added 2017's version for 14.11.25325.0 as the new Visual C++ 2017 entry 
    April 7th, 2017 -- Added for 2017's version of 14.10.25008.0 as the new Visual C++ 2017 entry 
    October 24th, 2016 -- Updated for 2015's version info for 14.0.24215.1 
    August 18th, 2016 -- Updated 2015's version info for 14.0.24212 
    May 27th, 2016 -- Updated info for MSVC2015 Update 2 

  • 相关阅读:
    Facebook主页照片和封面照片的尺寸要求
    NopCommerce源码架构详解
    Razor语法大全
    IIS 8 上传图片 上传文件报413错误及仅Https下报413问题,IIS高版本的配置方案及Web.config配置全解
    (一) MongoDB安装与配置
    Net Core 导出PDF
    ASP.NET Core AutoWrapper 自定义响应输出
    浅谈Docker之Docker数据持久化Bind Mount和Volume(转)
    搭建mysql集群
    MySQL错误:Can't connect to MySQL server (10060) 解决方案
  • 原文地址:https://www.cnblogs.com/DoNetCShap/p/9547025.html
Copyright © 2020-2023  润新知