4

我有一个 C# 项目,如果它安装在客户端计算机上,我想访问 MS Outlook。“访问前景”部分是通过引用前景 COM 对象并从那里开始完成的。我的问题现在是“如果已安装”部分。目前,我的项目不能在没有安装 Outlook 的机器上编译,所以我假设我不必引用 Outlook 组件,而是在检测到存在 Outlook 之后动态加载和使用它,但我没有找到了一种方法来做到这一点。我是对的吗,有人对如何做到这一点有任何提示吗?

谢谢。

编辑:已解决。遵循 Hans Passant 在关于使用办公室 PIA 的评论之一中给出的建议,被证明是阻力最小的路径。我在我的无办公室机器上获取 PIA 有点困难,但是使用这个问题的公认答案克服了它。

4

2 回答 2

2

如果没有 Outlook COM 对象,您肯定无法在机器上编译程序集,但这并不意味着您的应用程序将完全无法在没有 Outlook 的机器上工作 - 只是试图创建或使用Outlook COM 对象将导致失败/抛出异常。

根据这个问题,检测 COM 对象是否存在的最佳方法是简单地尝试实例化它并在未安装它的情况下捕获产生的异常。

于 2011-02-18T13:37:43.550 回答
1

按照 Hans Passant 的建议,我现在用我的解决方案的详细信息来回答我自己的问题。我能够在没有安装办公室的计算机上编译和运行我的项目。主要问题是让 Visual Studio 知道它可以从 COM 对象获得哪个接口。这是通过为 Outlook 查找主接口程序集 (PIA) 文件来解决的。这个过程在这个问题中得到了更好的描述,但简短的故事是我的电脑上已经有了办公室 PIA,在这个位置:

C:\Program Files\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA

我用的是VS2010 pro,不知道其他版本是否包含文件。然后将相关文件复制到我的项目源文件夹中,包括在我的项目和源代码管理中,并对其进行引用。之后,我就可以在我的项目中使用 Outlook COM 类型并正确编译它。我也可以在没有安装办公室的情况下运行我的项目。这是通过尝试实例化相关的 COM 对象并在未安装 office 时捕获异常来实现的。以下示例代码显示了如何:

using Outlook = Microsoft.Office.Interop.Outlook;

namespace Foo
{
    public class Bar
    {
        public void Quux()
        {
            try
            {
                // try to instantiate outlook COM object.
                Outlook.Application outlookApp = new Outlook.Application();

                // if it works, fine. Proceed
                ...
            }
            // If we catch a COMException, assume no office installed. Deal accordingly.
            catch (System.Runtime.InteropServices.COMException)
            {
                ...
            }
        }
    }
}
于 2011-03-14T12:48:10.620 回答