如何确定是否已安装 VSTO 2010 运行时?

13

只需使用产品代码{388E4B09-3E71-4649-8921-F44A3A2954A7}调用MsiGetProductInfo()即可轻松检查是否安装了VSTO 2005 SE,如MSDN中所列出的

VSTO 2010/4.0运行时的产品代码是什么?还是有更好的方法来确定它是否已安装?这是针对我们的安装流程。

此外,我正在尝试找出同样适用于Windows 映像组件的方法。

6个回答

20

很遗憾,到目前为止,这里的回答似乎并没有涵盖所有方面。

产品代码

这似乎不太可靠——我们正在寻找一个最低版本,而不是一个特定版本。虽然理论上产品代码仅应在主要版本增量时更改,但我机器上的VSTO版本(10.0.40303)的产品代码为{A0FE0292-D3BE-3447-80F2-72E032A54875}。这表明Microsoft并不一定保持它们的稳定性,因此我建议这不是一个好的选择。

文件版本

另一个选择可能是检查VSTO程序集本身的存在/版本,这些程序集通常位于%PROGRAM FILES%\Common Files\Microsoft Shared\VSTO\10.0中。然而,我会说这个目录并不保证——实际目录似乎在注册表中指定,但显然这个解决方案现在不比直接从注册表获取版本好...

注册表

因此,按照注册表来看可能是唯一剩下的选择。

不幸的是,VSTO运行时版本可以出现在4个注册表位置之一:

  • HKLM\SOFTWARE\Microsoft\VSTO Runtime Setup\v4(32位,从Office 2010安装中安装的VSTO)
  • HKLM\SOFTWARE\Microsoft\VSTO Runtime Setup\v4R(32位,从可再发行程序包中安装的VSTO)
  • HKLM\SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v4(64位,从Office 2010安装中安装的VSTO)
  • HKLM\SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v4R(64位,从可再发行程序包中安装的VSTO)

注意:我没有确定的信息来源-我从Wouter van Vugt的博客文章这个SO答案等地方搜集信息。可能还有更多的内容。

此外,可能存在最低版本要求,但我怀疑实际上只会影响运行Office 2010预发布版本的人:

Visual Studio 2010 用于 Office 的工具运行时环境也随 Microsoft Office 2010 一起发布。但是,在 Office 2010 RTM 时,Office 中的运行时仅支持针对 .NET Framework 3.5 的 Office 解决方案。如果您的解决方案针对 .NET Framework 3.5,则可以在安装 Office 2010 或 Visual Studio 2010 用于 Office 运行时可再发行软件包的情况下运行。如果您的 Office 解决方案针对 .NET Framework 4,则必须重新分发 Visual Studio 2010 用于 Office 的工具运行时环境(citation)。

1
一些注册表的实现方式:https://github.com/it3xl/vsto-installed-check/blob/master/check.bat - it3xl

10

最简单的方法是检查注册表。

HKLM\Microsoft\vsto runtime setup\v4\Install

HKLM\Microsoft\vsto runtime setup\v4R\VSTORFeature_CLR40(这适用于4.0版Office扩展)


1
那里的第二个答案(使用VSTORFeature_CLR40)可能更正确。我刚刚遇到一种情况,即找到了第一个注册表项(HKLM\Microsoft\vsto runtime setup\v4\Install),但我的加载项无法加载 - 实际上VSTO未安装。 - PandaWood
2
有人能详细说明如何检测已安装的VSTOR40是x86还是x64吗?我已经安装了所有x86和x64运行时的组合,上面提到的键是唯一创建的键 - 所有内容都在WOW6432Node下 - 这意味着无法确定已安装运行时的“位数”...(请注意,Office 2010有32位和64位版本,并且生成的.NET进程将与Office安装的位数相同http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/8d70d66c-fe87-4f38-b154-5804b871e153/) - Adam
我发现 VSTORFeature_ 只存在于 x64 安装中。请参见下面的答案以获取 x86 安装。 - Paul Nikonowicz

3
最安全和最干净的方法仍然是检查产品代码,以下是它们:
对于VSTO 2010 x86,版本10.0.31124:{41A01180-D9FD-3428-9FD6-749F4C637CBF} 对于VSTO 2010 x64,版本10.0.31124:{C3600AE6-93A0-3DB7-B7AA-45BD58F133B5} 我通过使用7-Zip提取以下软件包的内容并使用Orca分析MSI获得了它们:

http://download.microsoft.com/download/F/3/9/F395E3C2-28A0-4F0D-9E20-FF4D1ADB08D8/vstor40_x86.exe

http://download.microsoft.com/download/F/3/9/F395E3C2-28A0-4F0D-9E20-FF4D1ADB08D8/vstor40_x64.exe


1
安装的操作系统不同,密钥也会有所不同。我费尽心思地安装了独立的vsto和office 2010和2013 .exe文件(包括x86和x64版本)。为了使用注册表检查是否已安装vsto,您需要验证以下密钥是否存在:
对于x64: - HKLM\SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v4 -> Install - HKLM\SOFTWARE\Wow6432Node\Microsoft\VSTO Runtime Setup\v4 -> ProductCode 对于x86: - HKLM\SOFTWARE\Microsoft\VSTO Runtime Setup -> InstallerPath
编辑:实际上我最终做的是验证v4文件夹是否存在。

0

我需要一种在 SCCM 2012 中将 Vstor 部署为应用程序时检测此问题的方法。我使用以下 PowerShell 脚本从 WMI 检索信息。

如果版本是 10.0.50908,则生成输出。如果检测脚本返回任何值,SCCM 将认为检测成功。

$VstorVersion = Get-WmiObject -Query "select ProductVersion from SMS_InstalledSoftware where ARPDisplayName = 'Microsoft Visual Studio 2010 Tools for Office Runtime (x64)'" -NameSpace "root\cimv2\sms"
if ($VstorVersion.ProductVersion -ge '10.0.50908') {Write-Host "Found"}

-1
这里是代码。 在公共方法中,我们确定VSTO是从Office还是VSTO运行时包安装的。 在私有方法中,检查版本是否等于或大于VSTO2010的版本。

public static bool CheckVSTO2010 ( ) {
        string regFragment = IntPtr.Size == 8 ? "\\Wow6432Node\\" : "\\";
        string regVSTO = string.Format( @"SOFTWARE{0}Microsoft\VSTO Runtime Setup\", regFragment );
        return CheckVSTOVersion( regVSTO + "v4\\" ) || CheckVSTOVersion( regVSTO + "v4R\\" );
    }


    private static bool CheckVSTOVersion ( string keyPath ) {
        using (var key = Registry.LocalMachine.OpenSubKey( keyPath )) {
            //Not installed
            if (key == null) {
                return false;
            }
            var releaseKey = key.GetValue( "Version" );
            if (releaseKey != null && !string.IsNullOrEmpty( releaseKey.ToString() )) {
                var version = new Version( releaseKey.ToString() );
                return version.Major >= 10 && version.Build >= 40820;
            }
        }
        return false;
    }


2
尽管代码受到赞赏,但它应该始终有相应的解释。这并不需要很长,但是这是期望的。 - peterh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接