1

我有一个简单的单例模式类,我的应用程序通过它与 Outlook 集成,并且运行我的应用程序的几台计算机没有安装 Outlook。我已将所有互操作内容包装在 try-catch 中,以避免在 Outlook 不可用时引发异常,但我仍然会收到带有FileNotFound异常的自动错误报告。

这是我班上的(相关代码):

Imports Microsoft.Office.Interop
Public Class OutlookIntegration
    Private Shared _instance As OutlookIntegration

    Public Shared Sub Initialize()
        _instance = New OutlookIntegration()
    End Sub

    Private _outlookApp As Outlook.Application
    Private _outlookNs As Outlook.NameSpace
    Private ReadOnly _outlookEnabled As Boolean

    Private Sub New()
        Try
            _outlookApp = New Outlook.Application   
            _outlookNs = _outlookApp.GetNamespace("mapi")
            _outlookNs.Logon()

        Catch ex As Exception
            _outlookApp = Nothing
            _outlookEnabled = False
            Exit Sub
        End Try

        _outlookEnabled = True
    End Sub
End Class

我得到的错误是:

消息:无法加载文件或程序集 'office,Version=11.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c' 或其依赖项之一。该系统找不到指定的文件。System.IO.FileNotFoundException
at OutlookIntegration..ctor()
at OutlookIntegration.Initialize() in OutlookIntegration.vb: 第 7 行
MyApplication_Startup(Object sender, StartupEventArgs e) 在 ApplicationEvents.vb:line 139

(System.IO.FileNotFoundException) 无法加载文件或程序集 'office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' 或其依赖项之一。该系统找不到指定的文件。

好像我在这里遗漏了一些简单的东西。堆栈跟踪是红鲱鱼吗?

4

1 回答 1

1

在调用构造函数 ( OutlookIntegration..ctor() ) 期间将私有成员加载到内存 ( Outlook.Application,Outlook.NameSpace)并且客户端计算机上不存在相应的 Outlook 依赖项时,将引发异常。OutlookIntegration

有几种方法可以处理这个问题:

  1. 当构造函数抛出此异常时处理错误(在您的方法中尝试/捕获ctor声明Initialize()
  2. 创建另一个仅测试是否安装 Outlook 的类(避免使用私有成员
  3. 阅读告诉您 Outlook 是否存在的 Windows 注册表项

出于性能原因,最好不要抛出异常——所以#3是我的首选,但只要你不不断地执行这个检查,你应该可以使用这些选项中的任何一个。

于 2013-01-07T17:48:00.240 回答