扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
针对互操作程序集中的类型进行编程时,将像任何 CLR 引用类型一样对代理类型进行垃圾收集。一旦代理已经被垃圾收集,RCW 将把所有需要的 IUnknown::Release() 调用转发给关联的 COM 对象,并在这时销毁代理。使用该技术,可以确信只要代理在内存中是活动的,则关联的 COM 对象在内存中也是活动的。
如果希望确保 COM 类型以更及时和更可预言的方式被销毁,则可以利用 System.Runtime.InteropServices.Marshal 类型。该类定义了一个静态方法,名为 ReleaseComObject()。只是传递对象引用,关联的 COM 类型将被当场销毁:
using System.Runtime.InteropServices;
|
虽然销毁 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. |
另一方面,生成 Outlook 2003 外接程序时(本文随后介绍),将通过名为 OnConnection() 的方法传递 Application 实例:
public void OnConnection(object application, |
除了各种属性和方法以外,Application 类型还定义了在各种环境中触发的很多事件(StartUp、Quit、ItemSend、NewMailEx)。请考虑以下代码片段:
public class MyApp
|
再次,在给定互操作层的角色后,处理基于 COM 的事件的过程看起来与处理 CLR 事件的过程相同。暂时不要理会细节,只需注意 NewMailEx 事件与一个具体的委托(ApplicationEvents_11_NewMailExEventHandler) 一起工作,这个委托可以调用任何接受 System.String 作为其唯一参数,并且不返回任何内容的方法。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者