目前,我正在开发一个小型VSTO Outlook加载项。虽然我有一些C#的经验,但是我对Outlook对象模型不是很熟悉。
我的外接程序的范围非常简单。我和我的同事(在我们自己的同事旁边)有一个共享的Outlook收件箱。共享收件箱中的类别和子文件夹具有相同的名称。例如。有一个子文件夹“ Michael”,并且有一个类别“ Michael”。当某人将自己的类别应用于共享收件箱中的邮件时,该邮件将自动移动到匹配的子文件夹,打开回复窗口,并将发件人地址从共享电子邮件地址更改为个人电子邮件地址(我们的IT部门调整了共享邮件地址,使其无法发送电子邮件)。
目前,该外接程序的当前版本可以正常工作,而且一段时间后它会以某种方式停止工作。因此,当我启动Outlook时,一切工作都按预期进行,我可以在共享收件箱中对邮件进行分类,然后将其移动。等等。但是过了一段时间(有时是几个小时,有时甚至是30分钟后),它不再起作用了。 Visual Studio和Outlook中的调试视图均未指示任何错误。刚开始我以为是某个东西终止了我的加载项,但是后来我配置了一个计时器,将“我还活着”消息发送到日志文件,现在我可以看到该加载项仍在运行。
因此,我认为以某种方式注册的事件不足以跟踪Outlook中的用户操作。可以确认为,当出现此行为并对邮件进行分类时,未触发事件处理程序中的断点。我已经在启动方法中注册了以下事件:
Outlook.Application application = this.Application;
Outlook.Inspectors inspectors = application.Inspectors;
Outlook.Explorer activeExplorer = this.Application.ActiveExplorer();
// When a new mail is created, trigger Inspectors_AddTextToNewMail() methode
inspectors.NewInspector = new Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_AddTextToNewMail);
// Whenever something in the explorer is selected, run the event handler
activeExplorer.SelectionChange += ActiveExplorer_SelectionChange;
在selectionChange()事件处理程序中,注册了另一个用于更改邮件属性的事件侦听器:
Outlook.MailItem mailItem = selectedItem as Outlook.MailItem;
// Register an Event handler that listens for changes of the mailitem's properties in order to check the category
mailItem.PropertyChange += MailItem_PropertyChange;
这样,我可以检查类别是否已应用。
但是一段时间后,无论我在Outlook中选择什么,都不会触发ActiveExplorer_SelectionChange事件。
有人知道我是否错过了什么吗?我是否需要注册参加更多活动,才能使加载项不会失去踪迹?
谢谢您的帮助!
最好的问候,
珀西
答案 0 :(得分:0)
您需要在全局(类)级别上声明变量application
,inspectors
和activeExplorer
,以防止垃圾回收器释放它们。