如果未安装COMponent,请避免使用Interop时出错

时间:2015-03-25 15:22:56

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

  

"如果要使用Interop,则应安装组件   系统。否则,它就不会起作用。"

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

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

两个键:

  1. 有些用户无法安装该组件。或者他们还没有安装它。
  2. 可以安装另一个用户组件。
  3. 任何编程方式:

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

    备注:

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

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

    我可以拥有这样的源代码:

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

    或者无论如何使用Outlool应用程序类或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窗体应用程序。它有一个参考   Interop.Outlook(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

1 个答案:

答案 0 :(得分:-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,我认为检测它的正确方法是尝试创建一个新的SpVoice()"用try / catch包装的实例。如果失败,则假设未安装语音。同样,嵌入interop将允许您避免运行时类型加载问题。

希望有所帮助。