科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用 C# 进行 Outlook 2003 编程的简介 2

使用 C# 进行 Outlook 2003 编程的简介 2

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

针对互操作程序集中的类型进行编程时,将像任何 CLR 引用类型一样对代理类型进行垃圾收集。

作者:中国IT实验室 来源:中国IT实验室 2007年9月8日

关键字: Outlook C#

  • 评论
  • 分享微博
  • 分享邮件

  针对互操作程序集中的类型进行编程时,将像任何 CLR 引用类型一样对代理类型进行垃圾收集。一旦代理已经被垃圾收集,RCW 将把所有需要的 IUnknown::Release() 调用转发给关联的 COM 对象,并在这时销毁代理。使用该技术,可以确信只要代理在内存中是活动的,则关联的 COM 对象在内存中也是活动的。

  如果希望确保 COM 类型以更及时和更可预言的方式被销毁,则可以利用 System.Runtime.InteropServices.Marshal 类型。该类定义了一个静态方法,名为 ReleaseComObject()。只是传递对象引用,关联的 COM 类型将被当场销毁:

 using System.Runtime.InteropServices;
class MyClass
{
  public void SomeMethod()
  {
    MyComObjectClass c = new MyComObjectClass();
    ...
    // Explicitly destroy COM type after use.
    Marshal.ReleaseComObject(c);
  }
}

 

  虽然销毁 COM 类型的想法听起来可能很吸引人,但必须知道在 AppDomain 中的其他 CLR 对象现在无法使用基本 COM 类型。有了这种(危险的)可能性,本文中的示例代码将避免使用 Marshal.ReleaseComObject()。

   在即将发布的 .NET 平台(Microsoft_ Visual Studio.NET_ 2005,即 Whidbey)的版本中,这个问题已经得到解决。有关进一步的详细信息,请参阅 http://blogs.msdn.com/yvesdolc/archive/2004/04/17/115379.aspx.

  Outlook 2003 对象模型

  一旦引用了 Outlook PIA,下一个任务就是调查 Microsoft.Office.Interop.Outlook 命名空间中的很多类型(图 2)。


图 2. Microsoft.Office.Interop.Outlook 命名空间

  不管类型的大小是多少,好消息是对象模型本身组织得非常好,并利用了常见设计模式。因此,一旦了解如何遍历联系人列表,则遍历收件箱项就会很简单。

  其他的好消息是,整个对象模型在帮助文件 (vbaol11.chm) 中有完整的介绍,默认情况下该帮助文件位于 :\Program Files\Microsoft Office\OFFICE11\1033 下(图 3)。


图 3. Outlook 2003 文档

  现在,坏消息(取决于您的视点)是帮助系统使用 VBScript 代码示例和成员原型。假定本文没有试图详细介绍 Outlook 2003 对象模型中的每个类型,请您参考该帮助系统来获得完整的信息。下面,让我们来研究某些核心类类型。

  Application 类型

  第一个要知道的类型被适当地称为"Application",它是层次结构中其他所有对象的根。一旦获得该类型的对象,就能以编程方式控制 Outlook 本身的所有方面。表 1 列出了某些需要注意的(但决不是所有)成员。

  表 1.选择 Application 类型的成员

 Application 类型的成员 基本含义 

 ActiveExplorer()

ActiveInspector()

 这些方法分别从当前 Outlook 实例检索 Explorer / Inspector 类型。本文随后描述资源管理器/检查器模型。
 CreateItem()  允许通过编程创建新的 Outlook 项。
 GetNamespace()  提供对数据存储项的访问。到 Outlook 2003 为止,MAPI 是唯一可以使用的命名空间,它用于访问 Outlook 文件夹组(收件箱、注释等)。
 Quit()  终止当前 Outlook 会话。
 COMAddIns 该属性允许您在运行时发现插入到当前 Outlook 实例中的外接程序集合。

   Explorers

  Inspectors

 这些属性允许获得强类型的 Explorers/Inspectors 集合。

  获得 Application 类型的确切方式将根据所开发软件的种类而有略微的不同。如果要生成一个合并 Outlook 2003 的自定义应用程序,则要做的所有事情是使用 C# new 关键字创建该类型:

 // Create an Outlook Application object.
Application outLookApp = new Application();

  另一方面,生成 Outlook 2003 外接程序时(本文随后介绍),将通过名为 OnConnection() 的方法传递 Application 实例:

 public void OnConnection(object application,
  Extensibility.ext_ConnectMode connectMode,
  object addInInst, ref System.Array custom)
{
  // Assume 'applicationObject' is a member variable of
  // type Microsoft.Office.Interop.Outlook.Application.
  applicationObject = (Microsoft.Office.Interop.Outlook.Application)
    application;
}

  除了各种属性和方法以外,Application 类型还定义了在各种环境中触发的很多事件(StartUp、Quit、ItemSend、NewMailEx)。请考虑以下代码片段:

 public class MyApp
{
  public static void Main()
  {
    // Create an Outlook Application object.
    Application outLookApp = new Application();
    // Rig up the NewMailEx event.
    outLookApp.NewMailEx += new
      ApplicationEvents_11_NewMailExEventHandler(outLookApp_NewMailEx);
    ...
  }
  private static void outLookApp_NewMailEx(string EntryIDCollection)
  {
    // Do something interesting when a new e-mail arrives.
  }
}

 

  再次,在给定互操作层的角色后,处理基于 COM 的事件的过程看起来与处理 CLR 事件的过程相同。暂时不要理会细节,只需注意 NewMailEx 事件与一个具体的委托(ApplicationEvents_11_NewMailExEventHandler) 一起工作,这个委托可以调用任何接受 System.String 作为其唯一参数,并且不返回任何内容的方法。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章