As I said, add an Items collection object at class level. Also, it's not
good practice to use a lot of dot operators as you're doing. .NET creates
internal object variables for each level of dot operator and you have no
control over those, when they go out of scope or if they create memory
leaks.
You also should be using the Outlook.Application object passed to you by
VSTO and not instantiating a new Outlook.Application object. The one passed
by VSTO is trusted, the one you create isn't trusted.
I'd really suggest that you download the sample VSTO Outlook addins from the
Office development Web site at MS to see the basics of how to do things and
what some of the best practices are.
What you need to do is something like this:
using Outlook = Microsoft.Office.Interop.Outlook;
public partial class ThisApplication
{
Outlook.MAPIFolder fldCalendar = null;
Outlook._Application outlookObj = null;
Outlook.Items _items = null;
private void ThisApplication_Startup(object sender, System.EventArgs e)
{
outlookObj = this;
Outlook.NameSpace ns = outlookObj.GetNameSpace("MAPI);
fldCalendar =
ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFol derCalendar);
_items = (Outlook.Items)fldCalendar.Items;
_items.ItemChange += new
Outlook.ItemsEvents_ItemChangeEventHandler(Items_I temChange);
And so on.
That "_items" collection will remain in scope as long as your addin is
running and won't get garbage collected. You also see how I declare and use
separate Outlook objects instead of using multiple dot operators.
--
Ken Slovak
[MVP - Outlook]
http://www.slovaktech.com
Author: Professional Programming Outlook 2007.
Reminder Manager, Extended Reminders, Attachment Options.
http://www.slovaktech.com/products.htm
"Abhi." wrote in message
...
Hello Ken,
Thanks for your reply.
I am using VS 2005 C# Office Outlook add-in for Outlook 2003. My code is
like,
public partial class ThisApplication
{
Microsoft.Office.Interop.Outlook.MAPIFolder fldCalendar = null;
Microsoft.Office.Interop.Outlook._Application outlookObj = new
Microsoft.Office.Interop.Outlook.Application();
private void ThisApplication_Startup(object sender, System.EventArgs e)
{
fldCalendar =
(Microsoft.Office.Interop.Outlook.MAPIFolder)outlo okObj.Session.GetDefaultFolder(Microsoft.Office.In terop.Outlook.OlDefaultFolders.olFolderCalendar);
fldCalendar.Items.ItemChange += new
Microsoft.Office.Interop.Outlook.ItemsEvents_ItemC hangeEventHandler(Items_ItemChange);
fldCalendar.Items.ItemAdd += new
Microsoft.Office.Interop.Outlook.ItemsEvents_ItemA ddEventHandler(Items_ItemAdd);
fldCalendar.Items.ItemRemove += new
Microsoft.Office.Interop.Outlook.ItemsEvents_ItemR emoveEventHandler(Items_ItemRemove);
}
private void Items_ItemAdd(object Item)
{
}
private void Items_ItemChange(object Item)
{
}
private void Items_ItemRemove()
{
}
private void InternalStartup()
{
this.Startup += new
System.EventHandler(ThisApplication_Startup);
this.Shutdown += new
System.EventHandler(ThisApplication_Shutdown);
}
}
even I tried with,
private void InternalStartup()
{
this.Startup += new
System.EventHandler(ThisApplication_Startup);
this.Shutdown += new
System.EventHandler(ThisApplication_Shutdown);
((Microsoft.Office.Interop.Outlook.MAPIFolder)outl ookObj.Session.GetDefaultFolder(Microsoft.Office.I nterop.Outlook.OlDefaultFolders.olFolderCalendar)) .Items.ItemAdd
+= new
Microsoft.Office.Interop.Outlook.ItemsEvents_ItemA ddEventHandler(Items_ItemAdd);
((Microsoft.Office.Interop.Outlook.MAPIFolder)outl ookObj.Session.GetDefaultFolder(Microsoft.Office.I nterop.Outlook.OlDefaultFolders.olFolderCalendar)) .Items.ItemChange
+= new
Microsoft.Office.Interop.Outlook.ItemsEvents_ItemC hangeEventHandler(Items_ItemChange);
((Microsoft.Office.Interop.Outlook.MAPIFolder)outl ookObj.Session.GetDefaultFolder(Microsoft.Office.I nterop.Outlook.OlDefaultFolders.olFolderCalendar)) .Items.ItemRemove
+=new
Microsoft.Office.Interop.Outlook.ItemsEvents_ItemR emoveEventHandler(Items_ItemRemove);
}
So where should I add event handler now in order to avoid from being
garbage
collected ?
Any other way to do this?
Thanks.
Abhi