C# 如何从注册表检索已安装的应用程序版本?

C# 如何从注册表检索已安装的应用程序版本?,c#,registry,C#,Registry,我想获得安装在我机器上的软件的版本号……是否可以使用C#中的注册表类 你要看哪个键,如何确定它是一个版本号?没有任何保证,因为它将随着供应商的变化而变化 另一种方法是枚举计算机上的可执行文件(例如在C:\Program Files\及其子文件夹中),并使用FileVersionInfo从可执行文件本身提取版本信息: FileVersionInfo fi = FileVersionInfo.GetVersionInfo("yourexe.exe"); 你要看哪个键,如何确定它是一个版本号?没有任

我想获得安装在我机器上的软件的版本号……是否可以使用C#中的注册表类


你要看哪个键,如何确定它是一个版本号?没有任何保证,因为它将随着供应商的变化而变化

另一种方法是枚举计算机上的可执行文件(例如在
C:\Program Files\
及其子文件夹中),并使用
FileVersionInfo
从可执行文件本身提取版本信息:

FileVersionInfo fi = FileVersionInfo.GetVersionInfo("yourexe.exe");

你要看哪个键,如何确定它是一个版本号?没有任何保证,因为它将随着供应商的变化而变化

另一种方法是枚举计算机上的可执行文件(例如在
C:\Program Files\
及其子文件夹中),并使用
FileVersionInfo
从可执行文件本身提取版本信息:

FileVersionInfo fi = FileVersionInfo.GetVersionInfo("yourexe.exe");

您可以按以下方式获取版本:-

string version = sk.GetValue("Version");

如果版本密钥可用,它将返回值,否则将返回null。

您可以按以下方式获取版本:-

string version = sk.GetValue("Version");

如果版本密钥可用,它将返回值,否则将返回null。

安装程序存储产品信息的位置没有标准且通常可访问。但是,安装程序数据库确实包含此信息(其中产品直接或间接使用MSI),并且此信息可通过WMI获得

WMI也可从.NET使用类型。查询:

select name,version from Win32_Product

使示例适应此查询应该不会太难。

安装程序存储产品信息的地方没有标准且通常可访问的位置。但是,安装程序数据库确实包含此信息(其中产品直接或间接使用MSI),并且此信息可通过WMI获得

WMI也可从.NET使用类型。查询:

select name,version from Win32_Product

使示例适应此查询应该不会太难。

不能保证您会在注册表中找到有关程序的版本信息。我确实使用注册表项
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Path\programname
查找完整路径,但仍取决于安装程序来设置此值。如果使用此约定足够好,那么可以使用完整路径调用
GetFileVersionInfo(…)

它仍然由开发者填写有用的资源信息,如版本、公司名称、描述、版权等。。。 您可以告诉某些程序在资源中有旧的默认“待办事项”占位符。其他人,即使是微软,也会忘记在Dumprep等程序的资源中包含公司名称。在没有Visual Studio的情况下创建的其他Exe不需要包含任何可由
GetFileVersionInfo()访问的资源段

最终,我发现这个函数是最可靠的。还要注意,在调用
GetFileVersionInfo()
之前,请确保调用
GetFileVersionSize()

如果是x64版本的Windows,在某些情况下,您可能需要调用
Wow64DisableWow64FsRedirection(…)
&
Wow64RevertWow64FsRedirection(…)
或者,如果正在查看的程序位于重定向的系统文件夹中,请使用SysNative。

不能保证您能在注册表中找到程序的版本信息。我确实使用注册表项
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Path\programname
查找完整路径,但仍取决于安装程序来设置此值。如果使用此约定足够好,那么可以使用完整路径调用
GetFileVersionInfo(…)

它仍然由开发者填写有用的资源信息,如版本、公司名称、描述、版权等。。。 您可以告诉某些程序在资源中有旧的默认“待办事项”占位符。其他人,即使是微软,也会忘记在Dumprep等程序的资源中包含公司名称。在没有Visual Studio的情况下创建的其他Exe不需要包含任何可由
GetFileVersionInfo()访问的资源段

最终,我发现这个函数是最可靠的。还要注意,在调用
GetFileVersionInfo()
之前,请确保调用
GetFileVersionSize()

如果是x64版本的Windows,在某些情况下,您可能需要调用
Wow64DisableWow64FsRedirection(…)
&
Wow64RevertWow64FsRedirection(…)
,或者如果您正在查看的程序位于重定向的系统文件夹中,则使用SysNative。

您感兴趣的软件是什么?@Oleg一定是德国人;-)@Uwe Keim:谢谢Uwe!已经修好了。你对什么软件感兴趣?@Oleg一定是这里的德国人;-)@Uwe Keim:谢谢Uwe!已经修好了。-1:正确,但没用。这就是从注册表项中读取值的方式,但问题是:保存版本信息的键/值在哪里(快速回答:某些应用程序可能在注册表中有此项,但通常不在注册表中)。@Richard:没错……有什么方法可以帮上忙吗?-1:正确,但没用。这就是从注册表项中读取值的方式,但问题是:保存版本信息的键/值在哪里(快速回答:某些应用程序可能在注册表中有此项,但通常不在注册表中)。@Richard:没错……有什么方法可以帮上忙吗?@Sisya yup,但您不必将搜索限制在
程序文件
。查看此链接:@Sisya是的,但您不必将搜索限制在
程序文件
。请参阅此链接: