2017-06-15 61 views
0

我试图处理ItemAdd事件触发时,一个新项目被添加到VB.net vsto加载项中的SentItems文件夹。当我试试这个:展望vb.net如何处理SentItems文件夹的ItemAdd事件

Private WithEvents mySentItems As Outlook.Items 
mySentItems = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items 

我得到的第二行,我觉得,因为我以为我只是宣称它超级离奇一个Declaration Expected错误。

如果我这样做:

Private WithEvents mySentItems As Outlook.Items = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items 

的外接编译但随后前景变得非常生气,甚至不会加载抛出该异常后加入:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> 
System.NullReferenceException: Object reference not set to an instance of an object. 

我在任何类别声明之前,在ThisAddin类声明后执行所有这些操作。

感谢您的任何帮助,您可能会提供。

回答

0

您可以使用下面的声明在代码中所有Outlook对象初始化后,看上去就像一个属性或方法返回null(在VB.NET中为Nothing):

Private WithEvents mySentItems As Outlook.Items = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items 

另一个方面是,多点是用于单行代码中。很难理解哪些属性或方法确实会触发异常,除非您打破链并在一行代码中声明每个属性和方法。

此外,您不立即释放底层的COM对象。完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。然后在Visual Basic中将变量设置为Nothing(C#中的空值)以释放对该对象的引用。请阅读Systematically Releasing Objects文章中的更多内容。

+0

我认为我错过的部分是“毕竟Outlook对象被初始化”,这就是为什么当我将语句移动到子对象时,它的工作原理。谢谢。老实说,我不太了解ReleaseComObject部分:我应该发布哪个对象?如果我释放Items集合,我还可以捕获SentItem事件吗? – Edgar

0

看来你不能在一个子或函数之外进行任务。我将该行

mySentItems = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items 

移动到ThisAddin_Startup子行,它按预期工作。

感谢您查看此内容,如果您确实这么做了,说实话,我不会仅仅发布我自己的回答,但在我终于提出问题之前,我没有设法解决这个问题。

相关问题