在C#中动态加载和使用COM对象

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

谢谢。

编辑:已解决。 根据Hans Passant在关于使用办公室PIA的一条评论中给出的建议,certificate是阻力最小的路径。 在我的办公室机器上获得PIA时遇到了一些困难,但是使用这个问题的接受答案就克服了这个问题。

如果没有Outlook COM对象,您肯定无法在计算机上编译程序集,但这并不意味着您的应用程序将完全无法在没有Outlook的计算机上运行 – 只是尝试创建或使用Outlook COM对象将导致抛出失败/exception。

根据这个问题 ,检测COM对象是否存在的最佳方法是尝试实例化它并在未安装它的情况下捕获结果exception。

按照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时捕获exception来实现的。 以下示例代码显示了如何:

 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) { ... } } } }