C# 有没有合适的方法来检查机器上是否安装了特定的Microsoft应用程序?
考虑以下场景-- 假设您正在编写一个需要使用特定Windows应用程序的应用程序。具体来说,它是一个安装各种API工具的应用程序,旨在将应用程序集成到其他一些Microsoft软件或服务中 现在,让我们做几个其他假设,如下所示:C# 有没有合适的方法来检查机器上是否安装了特定的Microsoft应用程序?,c#,.net,windows,C#,.net,Windows,考虑以下场景-- 假设您正在编写一个需要使用特定Windows应用程序的应用程序。具体来说,它是一个安装各种API工具的应用程序,旨在将应用程序集成到其他一些Microsoft软件或服务中 现在,让我们做几个其他假设,如下所示: 您的应用程序不关心安装了该工具的哪个版本,因为版本更改往往只是修复错误的小更新,或者是让组件正确安装在不同版本的Windows上的补丁 您正在编写一个国际工具,因此您需要的Microsoft组件工具有可能安装在您的最终用户计算机上,但它可以用非英语名称安装 此外,您的
- 您的应用程序不关心安装了该工具的哪个版本,因为版本更改往往只是修复错误的小更新,或者是让组件正确安装在不同版本的Windows上的补丁
- 您正在编写一个国际工具,因此您需要的Microsoft组件工具有可能安装在您的最终用户计算机上,但它可以用非英语名称安装
- 此外,您的应用程序分布在一个zip文件中您的用户没有安装您的软件,因此您无法创建安装程序附加功能。相反,您必须运行应用程序,然后检查是否已安装所需的Microsoft工具
顺便说一句,我们实际上有一些Microsoft工具需要检查。我不想包括一个列表,因为我希望有一种适度直接的方法来解决对多种不同工具的需求。这里有两个相关的答案可以帮助您: 基本上,您需要了解两个GUID值:ProductCode和UpgradeCode ProductCode标识所使用的确切安装包,并且对于每个版本应该完全不同(假设安装程序编程正确) UpgradeCode标识整个产品本身,不应在版本之间更改(同样,假设安装程序编程正确)。这就是你需要寻找的
您可能需要检查的一件事是,开发人员是否对产品的不同语言版本使用了不同的升级代码。您是否考虑过检查HKEY\U CLASSES\U ROOT中的注册表?我相信对于特定的类应该有一个唯一的CLSID。不过我可能错了。例如,在我的注册表中:
HKEY_CLASSES\u ROOT\Microsoft.PhotoAcquire\CLSID
的值为{00f26e02-e9f2-4a9f-9fdd-5a962fb26a98}
@rory.ap。可能的问题是,我在任何地方都找不到一个确认,在同一应用程序的不同版本中,该值是否应该相同。我发现了一些看起来像它们可以工作的值,但是没有明确的文档说明这样的值可以(甚至应该)是一致的。我会认真考虑重新访问你的第一个假设。在当前发布的版本中,您知道您的代码可以安全地使用其中任何一个版本。但我会非常谨慎地断言,您的代码将在所有尚未编写的未来版本中安全运行。@Damien_,不信者,我通常理解,但这是一个非常小的、模糊的小工具,只不过是一个修补程序。问题是,一些用户可能会有一些小的变化,对于我们使用的一个特定工具,很难找到能够正常工作的版本(到目前为止基本上是所有版本),因为没有一个好的版本列表可以提供我们需要的所有细节。此外,我们的客户群有数百人。我们正在努力覆盖99%的案件。另外1%的人可以联系支持人员,我们可以亲自帮助他们。是的,ProductCode和UpgradeCode的名称似乎应该选择另一种方式。谁知道微软在想什么:)好吧,Foo1.0和Foo2.0企业版是两种不同的产品。但出于升级目的,Foo 2.0 EE安装程序应该能够找到Foo 1.0/1.1/1.2,而不需要所有适用产品的详尽列表。因此,名称确实有意义。ProductCode(稳定)和ReleaseCode/VersionCode(更改)将更有意义。典型的Microsoft.FYI,这可能就是答案。我患病毒性感冒和链球菌性咽喉炎已经有一段时间没有工作了。当我有机会进行实验并观察这些值时,我会的。非常感谢。