【问题标题】:Avoid errors using Interop if the COMponent aren't installed如果未安装 COMponent,则避免使用 Interop 时出错
【发布时间】:2015-05-29 08:46:03
【问题描述】:

"如果你想使用Interop,那么组件应该安装在 系统。否则,将无法正常工作。”

我有一个 WinForm 应用程序,许多用户在几个 SO(WinXP、Win7、Win8.1、WinServer 2008、WinServer 2012)中使用它

在开发中,我使用了一个 COM 组件(Outlook、SpeechLib、...)。

两个键:

  1. 某些用户无法安装该组件。或者他们没有安装它。
  2. 其他用户可以安装该组件。

任何编程方式:

  • 避免未安装组件的用户应用失败
  • 该应用程序适用于已安装该组件的用户

?

注意事项:

以编程方式确定特定 COM 库 DLL 是否已安装或已安装。无论如何,如果没有安装特定的 COM 库,目标是我的源代码在没有安装该 COM 的机器上运行时不会失败。

例如,用于Excel、Word、Outlook COM (ActiveX)、SpeechLib(Microsoft 语音对象库)

我可以有这样的源代码:

 SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
    SpeechLib.ISpeechVoice speech = new SpeechLib.SpVoiceClass();
    // ....

或者无论如何使用 Outool 应用程序类,或 Excel.Application 等。

Type officeType = Type.GetTypeFromProgID("Excel.Application");
if (officeType == null)
{
    // Excel is not installed.
    // Show message or alert that Excel is not installed.
}
else
{
    // Excel is installed.
    // Continue your work.
}

我的老问题,但不是解决方案:

检测安装的 Outlook 并动态加载 INterop.Outlook Detect Outlook installed and load dynamically INterop.Outlook

我在 VS2010 中有一个 Windows 窗体应用程序。它有一个参考 互操作性展望 (2003)。然后,我重新安装了 Windows XP 并 VS2010,但不安装 Outlook。

现在,项目无法编译。

我认为,如果未安装 Outlook,我的应用程序将无法运行 我的程序在其上执行的机器。

我需要知道我是否检测到 Outlook 已安装并动态加载 Interop.Outlook.dll(用于使用 Outlook PIA 或 Embedded Interop .NET 4) 中的类型。

如果机器有 Outlook (2003, 2007, 2010, 可能需要代码来 检测版本并执行 Outlook 版本的兼容性)安装, 该应用程序可以在功能上与 Outlook 配合使用。

如果机器没有安装 Outlook,(在运行时)应用程序 没有功能 Outlook 也可以正常工作。我想,如果机器 尚未安装 Outlook,(在运行时)应用程序失败,因为 对 Outlook.Application 类的引用(在源代码中)?

在开发机器中,应用程序可以正常工作,因为 Outlook(和 COM) 已安装在机器中。

有没有关于它的示例源代码或 goog 模式和实践?

参考文献

如果机器中未安装 Office,此代码是否会失败? How to detect installed version of MS-Office?

http://www.codeproject.com/Tips/679027/How-to-Check-Whether-Excel-is-Installed-in-the-Sys?msg=5027820#xx5027820xx How to check, programatically, if MS Excel exists on a pc?

http://codeblog.jonskeet.uk/2009/07/07/faking-com-to-fool-the-c-compiler

【问题讨论】:

  • 问题在哪里?看来您已经使用 Type.GetTypeFromProgID 方法找到了解决方案。
  • @EugeneAstafiev "如果你想使用Microsoft.Office.Interop.Outlook,那么组件应该安装在系统中。否则,它将无法工作。" 我使用此代码编译我的程序集olkApp1 = new Microsoft.Office.Interop.Outlook.Application(); olkMail1 = (MailItem)olkApp1.CreateItem(OlItemType.olMailItem); 加载程序集时,如果未安装 COM,则不会失败?

标签: c# com interop office-interop text-to-speech


【解决方案1】:

我在其他地方发布了这个,但这里是检测是否安装了 Outlook 的代码。基本上,它会尝试获取 Outlook 自动化对象。

using System;
using Microsoft.Office.Interop.Outlook;

class Program
{
    static void Main(string[] args)
    {
        var outlookType = Type.GetTypeFromProgID("Outlook.Application");
        if (outlookType == null)
        {
            Console.WriteLine("Not installed.");
        }
        else
        {
            var app = Activator.CreateInstance(outlookType) as Application;
            Console.WriteLine(app.Name);
        }
    }
}

对于 SpeechLib,我认为检测它的正确方法是尝试创建一个用 try/catch 包装的“新 SpVoice()”实例。如果失败,则假定未安装语音。同样,嵌入互操作可以让您避免运行时类型加载问题。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多