检测Office版本+友好名称

时间:2018-08-02 05:43:36

标签: c# outlook

我正在尝试以友好格式获取运行的Outlook版本,并且该版本是64位还是32位。到目前为止:

Writeline(Current version: + new Microsoft.Office.Interop.Outlook.Application().Version;);
// Current version: 15.0.0.5031

有任何提示吗?

2 个答案:

答案 0 :(得分:0)

您可以使用注册表确定Outlook是32位还是64位:

static bool IsOutlook64Bit() {
    using (RegistryKey officeKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Office")) {
        if (officeKey != null) {
            Regex versionExp = new Regex(@"^[1-9][0-9]*\.[0-9]+$");
            string maxVersion = officeKey.GetSubKeyNames()
                .Where(x => versionExp.IsMatch(x))
                .OrderByDescending(x => Decimal.Parse(x))
                .FirstOrDefault();

            if (!String.IsNullOrEmpty(maxVersion)) {
                using (RegistryKey key = officeKey.OpenSubKey(maxVersion + @"\Outlook")) {
                    if (key != null) {
                        string bitness = Convert.ToString(key.GetValue("Bitness", null));
                        return bitness.Equals("x64", StringComparison.OrdinalIgnoreCase);
                    }
                }
            }
        }
    }

    throw new InvalidOperationException("Outlook not found on this machine.");
}

注意:上面的方法使用最新版本,该版本可能不是正在运行的版本-但是,在大多数情况下,这是正确的。 Microsoft不建议安装任何Office产品的多个版本。为了达到100%的准确性,您可以解析问题中包含的版本号字符串,并匹配主要和次要部分(例如16.0),而不仅仅是采用最大值。

友好名称(例如Outlook 2016)无法通过对象模型获得,我也不相信可以在注册表中轻松查询它。将版本号的主要部分与已知值列表匹配可能会更容易;例如

int major = (int)Decimal.Parse(maxVersion);
switch (major) {
    case 12:
        return "Outlook 2007";
    case 14:
        return "Outlook 2010";
    case 15:
        return "Outlook 2013";
    case 16:
        return "Outlook 2016":
}

答案 1 :(得分:0)

据我所知,为此获得一个友好的名称并没有什么好处,您需要检查版本号。像Bradley的解决方案一样,可以获取Outlook的maxVersion。因此,我认为您可以继续编写代码并复制Bradley的代码以检查Outlook版本。如下所示:

var version = new Microsoft.Office.Interop.Outlook.Application().Version.Substring(0,2);
        int major = (int)Decimal.Parse(version);
        switch (major)
        {
            case 12:
                return "Outlook 2007";
            case 14:
                return "Outlook 2010";
            case 15:
                return "Outlook 2013";
            case 16:
                return "Outlook 2016";
        }