Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C#判断VC库是否安装

C#判断VC库是否安装

作者头像
码客说
发布于 2023-09-26 00:19:10
发布于 2023-09-26 00:19:10
46901
代码可运行
举报
文章被收录于专栏:码客码客
运行总次数:1
代码可运行

前言

判断VC是否安装有两种方式

  • 通过软件的GUID判断,这种方式比较准确,但需要知道程序的GUID,推荐使用。
  • 通过注册表中卸载程序的名称判断,这种方式并不太可靠。

下载地址

https://learn.microsoft.com/zh-CN/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported

通过GUID方式

https://learn.microsoft.com/zh-cn/windows/win32/api/msi/nf-msi-msiqueryproductstatea?redirectedfrom=MSDN

返回值

含义

INSTALLSTATE_ABSENT

已为另一用户安装该产品。

INSTALLSTATE_ADVERTISED

该产品已播发,但未安装。

INSTALLSTATE_DEFAULT

已为当前用户安装该产品。

INSTALLSTATE_INVALIDARG

向该函数传递了无效参数。

INSTALLSTATE_UNKNOWN

该产品既未播发,也未安装。

工具类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ReSharper disable InconsistentNaming
// ReSharper disable once InconsistentNaming
namespace env_monitor.Utils
{
    using System.Runtime.InteropServices;

    public class ZvcInstallCheckUtils
    {
        public static bool IsInstall(string msiid)
        {
            return GetProcuct(msiid) == INSTALLSTATE.INSTALLSTATE_DEFAULT;
        }

        [DllImport("msi.dll")]
        private static extern INSTALLSTATE MsiQueryProductState(string product);

        private static INSTALLSTATE GetProcuct(string product)
        {
            INSTALLSTATE state = MsiQueryProductState(product);
            return state;
        }
    }

    public 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
        INSTALLSTATE_SOURCE = 4, // run from source, CD or net
        INSTALLSTATE_DEFAULT = 5, // use default, local or source
    }
}

调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var installstate = ZvcInstallCheckUtils.IsInstall("{1D8E6291-B0D5-35EC-8441-6616F567A0F7}");
Console.WriteLine(installstate);

VC的GUID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Visual C++ 2005 Redistributable Package (x86)
{A49F249F-0C91-497F-86DF-B2585E8E76B7}

Visual C++ 2005 Redistributable Package (x64)
{6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}

Visual C++ 2005 Redistributable Package (ia64)
{03ED71EA-F531-4927-AABD-1C31BCE8E187}

Visual C++ 2005 SP1 Redistributable Package (x86)
{7299052B-02A4-4627-81F2-1818DA5D550D}

Visual C++ 2005 SP1 Redistributable Package (x64)
{071C9B48-7C32-4621-A0AC-3F809523288F}

Visual C++ 2005 SP1 Redistributable Package (ia64)
{0F8FB34E-675E-42ED-850B-29D98C2ECE08}

Visual C++ 2008 Redistributable Package (x86)
{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}

Visual C++ 2008 Redistributable Package (x64)
{350AA351-21FA-3270-8B7A-835434E766AD}

Visual C++ 2008 Redistributable Package (ia64)
{2B547B43-DB50-3139-9EBE-37D419E0F5FA}

Visual C++ 2008 SP1 Redistributable Package (x86)
{9A25302D-30C0-39D9-BD6F-21E6EC160475}

Visual C++ 2008 SP1  Redistributable Package (x86 9.0.30729.6161)
{9BE518E6-ECC6-35A9-88E4-87755C07200F}

Visual C++ 2008 SP1 Redistributable Package (x64)
{8220EEFE-38CD-377E-8595-13398D740ACE}

Visual C++ 2008 SP1 Redistributable Package (ia64)
{5827ECE1-AEB0-328E-B813-6FC68622C1F9}

Visual C++ 2010 Redistributable Package (x86)
{196BB40D-1578-3D01-B289-BEFC77A11A1E}

Visual C++ 2010 Redistributable Package (x64)
{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}

Visual C++ 2010 Redistributable Package (ia64)
{C1A35166-4301-38E9-BA67-02823AD72A1B}

Visual C++ 2010 SP1 Redistributable Package (x86 10.0.40219)
{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}

Visual C++ 2010 SP1 Redistributable Package (x64)
{1D8E6291-B0D5-35EC-8441-6616F567A0F7}

Visual C++ 2010 SP1 Redistributable Package (ia64)
{88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}

Visual C++ 2013 Redistributable Package (x86 12.0.21005)
{13A4EE12-23EA-3371-91EE-EFB36DDFFF3E} and {F8CFEB22-A2E7-3971-9EDA-4B11EDEFC185}

Visual C++ 2013 Redistributable Package (x64)
{929FBD26-9020-399B-9A7A-751D61F0B942} and {A749D8E6-B613-3BE3-8F5F-045C84EBA29B}

通过注册表方式

这种方式并不能准确找到,测试的时候我查找2010 x86可以找到,但是2010 x64的却找不到。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace env_monitor.Utils
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Win32;

    public class ZvcInstallCheckByRegUtils
    {
        public static bool IsInstallVc(string[] keywords)
        {
            List<string> lists = new List<string>();
            RegistryKey key = Registry.LocalMachine;
            GetRegistry(
                key,
                @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall",
                ref lists
            );
            if (lists.Count > 0)
            {
                string vcName = null;
                foreach (var s1 in lists.Where(x => keywords.All(x.Contains)))
                {
                    vcName = s1;
                    break;
                }
                Console.WriteLine(vcName);
                return !string.IsNullOrEmpty(vcName);
            }
            return false;
        }

        private static void GetRegistry
        (
            RegistryKey keyR,
            string str,
            ref List<string> list
        )
        {
            RegistryKey aimdir = keyR.OpenSubKey(str);
            if (aimdir != null)
            {
                var subvalueNames = aimdir.GetValueNames();
                foreach (string valueName in subvalueNames)
                {
                    if (valueName.ToLower().Equals("displayname") || valueName.ToLower().Equals("productname"))
                    {
                        if (aimdir.GetValue(valueName) != null && aimdir.GetValue(valueName).ToString().ToLower().Contains("microsoft visual c++"))
                        {
                            list.Add(aimdir.GetValue(valueName).ToString());
                        }
                    }
                }
                var subkeyNames = aimdir.GetSubKeyNames();
                foreach (string keyName in subkeyNames)
                {
                    GetRegistry(
                        aimdir,
                        keyName,
                        ref list
                    );
                }
            }
        }
    }
}

注意这里之所以使用数组来过滤是因为微软的名称命名也太不规范了。

比如"Microsoft Visual C++ 2010 x86 Redistributable - 10.0.40219",2010和x86之间竟然是2个空格,所以使用数组来判断,不但包含2010,而且包含x86才算匹配上。

测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var isInstall = ZvcInstallCheckByRegUtils.IsInstallVc(
    new[]
    {
        "2010",
        "x86"
    }
);
Console.WriteLine(isInstall);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
常用运行库(VC++、DirectX)必备运行库
作用:提供多媒体(尤其是游戏)所需的图形、音频、输入 API 支持。 最新版本:DirectX 12(Windows 10/11 内置),但许多游戏仍依赖 DirectX 9.0c 组件。
西里网
2025/04/15
3.7K0
各个版本Microsoft Visual C++运行库下载
Microsoft Visual C++ 2005 Redistributable Package (x86) http://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.exe Microsoft Visual C++ 2005 Redistributable Package (x64) http://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.exe
全栈程序员站长
2022/09/09
3.9K0
c/c++ 软件集成 安装和可卸载软件
  作为一个工程师应具备的一些能力: 1. 首先具备这款软件:     >inno  Setup      免费版还开源,良心货,妥妥的。 2. 这款软件上手也比较款,可自行参考使用文档 3.编译成功,生成代码之后,样子可能如下: 1 ; Script generated by the Inno Setup Script Wizard. 2 ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 3
Gxjun
2018/03/26
1.2K0
c/c++ 软件集成 安装和可卸载软件
SQL Server 2008正式发布了,示例数据库安装
等了好久,SQL Server 2008终于正式发布了,官方网站提供了SQL2008的下载试用,不过有一点不爽的就是他居然把X86,X64和IA64三种处理器的版本放在了同一个ISO中,我使用的是X86的操作系统(想必大多数用户也是这样吧),但是我却要把这个支持X64和IA64的ISO下载下来,本来X86只有1.5G左右,现在却要下载3.5G的一个ISO。郁闷啊,我可怜的硬盘空间,又有2G被浪费了。
深蓝studyzy
2022/06/16
9500
SQL Server 2008正式发布了,示例数据库安装
Pyinstaller ERROR: Assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none not found
问题描述 今天在windows7上用pyinstaller打包应用程序的时候,出现下面错误 ERROR: Assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none not found 问题原因 查了一下,有说是没有安装vc2008 x64和vc2008 x64 sp1导致的,或者安装的不是64位包导致的,但是检查了我的环境这两个包确实装的都是64位的。没办法,只能自己继续排错。 所以又准备了一个新环境,把各种要安装的包组合装了一下
kongxx
2018/05/14
1.3K0
静默命令行安装 Visual C++ 发行包
本文告诉大家如何通过命令行的方法,在安装程序静默调用 VC++ 库的安装,解决缺少环境问题
林德熙
2020/03/12
3.1K0
sql server 2000、2005/2008/2008R2/2012/2014/2016/2017/2019 express全版本下载地址
我用的是免费的Express with Advanced Services (SQLEXPRADV),sqlserver2016-2019的这个包不含SQL Server Management Studio (SSMS),需要单独安装SSMS或Azure Data Studio,sqlserver2005-2014这个包是含有SMSS的无需额外安装。优先在微软官网下载,如果找不到官网地址,均可在msdn.itellyou.cn下载,下载的时候注意下载最后一个稳定版本(一般是带最高版本service pack的那个),如果msdn.itellyou.cn访问不了,还可以访问www.imsdn.cn。
Windows技术交流
2020/02/11
22.8K0
zip版mysql使用'mysqld --initialize'初始化无反应/未生成data文件夹
缺少了Microsoft Visual C++ Redistributable软件包
kr
2024/07/11
7720
windows2023最新常用运行库 安装包合集下载-一键下载安装 windows下载合集完整版
Windows Server 2023是微软最新的服务器操作系统,随着时间的推移,可能会有新的常用运行库发布。以下是一些常用的运行库列表,可能会在Windows Server 2023中使用:
用户10519159
2023/04/27
1.6K0
SharePoint Foundation 2010
下图是一张SharePoint 2010基本架构图,它简要的描述出了SharePoint 2010的基本结构。SharePoint Foundation在之前的版本中,被称为Windows Share
张善友
2018/01/22
1K0
SharePoint Foundation 2010
DirectX修复工具下载(exagear模拟器数据包在哪里)
https://zhangyue667.lanzoui.com/i8rgDsmt43g
全栈程序员站长
2022/07/28
2.4K0
DirectX修复工具下载(exagear模拟器数据包在哪里)
如何在各个版本的VC及64位下使用CPUID指令
 前面我们探讨了在16位的DOS实模式下使用CPUID指令(http://www.cnblogs.com/zyl910/archive/2012/05/14/dos16_getcpuid.html)。而现在64位Windows系统已经很流行了,在32/64位模式下如何使用CPUID呢?于是本文介绍了如何在各个版本的VC及64位下使用CPUID指令。
用户3519280
2023/07/06
9220
如何在各个版本的VC及64位下使用CPUID指令
Python非官方的Windows二进制的扩展包
本文主要介绍非官方的windows二进制的扩展包相关的内容,以解决新手在学习和开发过程中碰到的这类问题。
苦叶子
2020/12/29
9870
Python非官方的Windows二进制的扩展包
卸载vs2012的步骤_plsql卸载详细步骤
要卸载VS系列时才发现卸载VS还是很麻烦的事情,经过研究网上的卸载工具都没什么用,还是要自己手动卸载才彻底些。
全栈程序员站长
2022/11/09
1.2K0
Visual Studio 2008 集成SP1补丁
/E ——– 复制目录和子目录,包括空的。与 /S /E 相同。可以用来修改 /T。
全栈程序员站长
2022/09/07
1.2K0
Windows再现“永恒之蓝”级漏洞--CVE-2019-0708
5月15日,微软发布安全补丁修复了CVE编号为CVE-2019-0708的Windows远程桌面服务(RDP)远程代码执行漏洞,该漏洞在不需身份认证的情况下即可远程触发,危害与影响面极大。
HACK学习
2019/08/06
2.1K0
Windows再现“永恒之蓝”级漏洞--CVE-2019-0708
SQL server 2008 数据库企业版安装教程图解
SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本。    在现今数据的世界里,公司要获得成功和不断发展,他们需要定位主要的数据趋势的愿景。微软的这个数据平台愿景帮助公司满足这些数据爆炸和下一代数据驱动 应用程序的需求。微软将继续投入和发展以下的关键领域来支持他们的数据平台愿景:关键任务企业数据平台、动态开发、关系数据和商业智能。
shirayner
2018/08/10
4.1K0
SQL server 2008 数据库企业版安装教程图解
Pytorch的C++端(libtorch)在Windows中的使用
填一个之前的坑啊,本篇的姊妹篇——利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测 这篇文章中已经说明了如何在Ubuntu系统中使用libtorch做预测,当初也有朋友问我如何在Windows之下尝试使用libtorch,当时因为时间关系没有去看,后来就给忘了…现在有时间了当然要尝试一下~
老潘
2023/10/19
1.4K0
Pytorch的C++端(libtorch)在Windows中的使用
win7应用程序无法正常启动0xc0000142(0xc000007b解决方案)
我们新安装的windows10后,有一些应用程序活游戏无法正常启动,产生(0xc000007b)错误,产生的原因有以下三种可能:1、DirectX9没有安装2、MicrosoftVisualC++没有安装3、.net没有安装解决的方法有两种:第1种:安装VisualStudio2010(如果你需要编程的话)32位系统只安装32位的即可,64
Java架构师必看
2022/04/11
1.2K0
最全Windows代系介绍,迎接Windows 2020,回顾Windows XP经典
Windows 在历史上曾出现过的产品可以划分为三个阶段,分别为:以 DOS 为基础的 Windows,以 Windows 9x 为代表的 Windows,以 NT 为基础开发的 Windows。
Windows技术交流
2020/03/24
6.2K8
推荐阅读
相关推荐
常用运行库(VC++、DirectX)必备运行库
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验