C# 检测某版本VC++是否安装
一、根据微软的产品号GUID,调用msi.dll
class Program
{
static void Main(string[] args)
{
if (GetProcuct("{GUID}") == INSTALLSTATE.INSTALLSTATE_DEFAULT)
{
//操作
}
}
[DllImport("msi.dll")]
private static extern INSTALLSTATE MsiQueryProductState(string product);
public 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
}
调用 MsiQueryProductState (函数详细:https://docs.microsoft.com/zh-cn/windows/win32/api/msi/nf-msi-msiqueryproductstatea?redirectedfrom=MSDN)函数,来查看VC++是否安装,该方式需要自定义一个枚举 INSTALLSTATE,还需要知道VC++软件的GUID,缺陷也是如果不知道GUID就难以使用。
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}
(参考:https://www.cnblogs.com/yidanda888/archive/2004/01/13/11987411.html)
二、查询本地注册表:“SOFTWARE\WOW6432Node\Microsoft\VisualStudio”。这里以查询VC++2015为例
public static string GetProcuct()
{
RegistryKey key = Registry.LocalMachine;
RegistryKey rkOpen = key.OpenSubKey("SOFTWARE\\WOW6432Node\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\x64", false);
if (rkOpen.GetValue("Version") == null)
{
return null;
}
return rkOpen.GetValue("Version").ToString();
}
缺陷是当安装VC++2017时,将会替换掉该注册表里的信息。https://developercommunity.visualstudio.com/content/problem/332815/visual-c-redistributable-2017-install-removes-visu.html
(参考:https://www.cnblogs.com/liujx2019/p/10307520.html)
三、查询注册表的删除目录,因为如果安装VC++就会在删除目录里存在。
public static void GetProcucts()
{
List<string> Lists = new List<string>();
RegistryKey key = Registry.LocalMachine;
GetRegistry(key, @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall", ref Lists);
if (Lists.Count > 0)
{if (!string.IsNullOrEmpty(Lists.FirstOrDefault(x => x.Contains("2015"))))
{
//操作
}
}
}
private static void GetRegistry(RegistryKey keyR, String str, ref List<string> list)
{ string[] subkeyNames;
string[] subvalueNames;
RegistryKey aimdir = keyR.OpenSubKey(str);
if (aimdir != null)
{
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++ 20") &&
aimdir.GetValue(valueName).ToString().ToLower().Contains("redistributable"))
{
list.Add(aimdir.GetValue(valueName).ToString());
}
}
}
subkeyNames = aimdir.GetSubKeyNames();
foreach (string keyName in subkeyNames)
{
GetRegistry(aimdir, keyName, ref list);
}
}
}
C# 检测某版本VC++是否安装的更多相关文章
- iOS开发之一句代码检测APP版本的更新
提示更新效果图如下,当然也是可以自定义类似与AlertView相似的自定义view,如京东.网易云音乐都是自定义了这种提示框的view.以下只展示,从App Store获取到app信息.并解析app信 ...
- Dubbo入门到精通学习笔记(三):持续集成管理平台之SVN版本管理系统的安装和使用
文章目录 持续集成管理平台介绍 持续集成介绍 持续集成管理平台的组成 持续集成实践介绍 即将学习 SVN版本管理系统的安装 安装 Subversion + Apache 安装 jsvnadmin 简单 ...
- 树莓派4B安装 百度飞桨paddlelite 做视频检测 (一、环境安装)
前言: 当前准备重新在树莓派4B8G 上面搭载训练模型进行识别检测,训练采用了百度飞桨的PaddleX再也不用为训练部署环境各种报错发愁了,推荐大家使用. 关于在树莓派4B上面paddlelite的文 ...
- 浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案
浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案 本文是截止目前为止最强攻略,按照本文方法基本可以无压力应对caffe和Ross B. Girshick的 ...
- Ubuntu 及衍生版本用户如何安装 SmartGit/HG
http://www.linuxidc.com/Linux/2014-06/102621.htm Ubuntu 及衍生版本用户如何安装 SmartGit/HG 6.0.0 [日期:2014-06-03 ...
- Centos 升级MySQL版本或者Yum安装Mysql5.6
Centos 升级MySQL版本或者Yum安装Mysql5.6 1.从MySQL Yum仓库下载最新的rpm文件:http://dev.mysql.com/downloads/repo/yum/Cen ...
- 检测浏览器版本类型的JavaScript代码,终极版
下面的JavaScript代码,不仅可以判断PC端浏览器类型,还可以判断安卓.iOS.其他智能手机.平板电脑或游戏系统. 说废话貌似不是我的风格哈,直接上代码吧: var client = funct ...
- CDH版本的oozie安装执行bin/oozie-setup.sh prepare-war,没生成oozie.war?
不多说,直接上干货! 前期博客 Oozie安装部署 问题描述 bin/oozie-setup.sh prepare-war 解决办法 [hadoop@bigdatamaster bin]$ pwd / ...
- Unity2017.x 版本的下载安装
Unity2017 版本从2017年7月开始正式发布Unity2017.1版本,为了初学者更加清晰明了的掌握全过程,笔者还是以完整的共19个步骤来给大家演示下载与配置安装的全过程,方便广大读者的无障碍 ...
随机推荐
- Day12 抽象类、接口、内部类-面向对象编程(3)
抽象类 abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类: 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类. ...
- Unittest方法 -- 测试固件(TestFixture)
前置和后置 1.setUp:在写测试用例的时候,每次操作其实都是基于打开浏览器输入对应网址这些操作,这个就是执行用例的前置条件.2.tearDown:执行完用例后,为了不影响下一次用例的执行,一般有个 ...
- hash表/哈希表
https://blog.csdn.net/duan19920101/article/details/51579136 简单理解就是一个通过映射直接查找的表(散列表),用哈希函数将数据按照其存储特点进 ...
- response 重定向
背景: controller层需要重定向到其他html界面时,需要用如下代码 // 设置302状态码 response.setStatus(302); // 设置location响应头 respons ...
- (Opencv4)二值化图像
(Opencv4)二值化图像 ret, dst = cv2.threshold(src, thresh, maxval, type) threshold : 极限,临界值,阈值 ret: 一个数 s ...
- Floyd弗洛伊德算法
先看懂如何使用 用Java实现一个地铁票价计算程序 String station = "A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A1 ...
- js排序——sort()排序用法
sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点. 语法:array.sort(fun):参数fun可选.规定排序顺序.必须是函数.注:如果调用该方法 ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- Arp欺骗和DNS投毒
中间人攻击 ARP缓存攻击 ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC地址.简单来说,就 ...
- postman 常见异常问题的处理
1.postman一直转圈打不开的问题 一般这种问题是因为缓存过多,所以这里需要清理下缓存文件,即:删除%appdata%目录下的postman文件,删除之后可恢复正常. 这个文件夹是隐藏的,对于文件 ...