C# 使用一种方法来;项目加上「;来自“的事件”;项目“;用C语言收集#

C# 使用一种方法来;项目加上「;来自“的事件”;项目“;用C语言收集#,c#,visual-studio,events,outlook,C#,Visual Studio,Events,Outlook,我目前正在将用VB编写的VSTO加载项迁移到C#for outlook 总体思路是将每一封电子邮件信息都记录到我自己的数据库中。 我已经彻底搜索过了,似乎NewMail/NewMailEX事件(来自应用程序对象)是处理它的最佳选项 但是,outlook客户端关闭时收到的电子邮件不会触发这两个事件。 我在尝试处理启动时从exchange服务器下载的所有邮件时遇到问题,因此我认为items collection中的“Item add”事件可能会解决此问题 我知道这可以在“item add”事件中解决

我目前正在将用VB编写的VSTO加载项迁移到C#for outlook

总体思路是将每一封电子邮件信息都记录到我自己的数据库中。 我已经彻底搜索过了,似乎NewMail/NewMailEX事件(来自应用程序对象)是处理它的最佳选项

但是,outlook客户端关闭时收到的电子邮件不会触发这两个事件。 我在尝试处理启动时从exchange服务器下载的所有邮件时遇到问题,因此我认为items collection中的“Item add”事件可能会解决此问题

我知道这可以在“item add”事件中解决,因为我们实际上是在VB代码中处理这个问题

但是,当您尝试为Outlook中的每个收件箱文件夹订阅“项目添加”事件时,什么都不会发生! 没有抛出任何错误或异常

在我们的VB代码中, 我们可以通过以下代码成功注册上述事件:

outlookNameSpace = Me.Application.GetNamespace("MAPI")
inbox = outlookNameSpace.Stores(account).GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
Mailitem = inbox.Items

Private Sub Items_ItemAdd(ByVal item As Object) Handles Mailitem.ItemAdd
以下是我失败的C#代码:


引发事件的对象(myInboxItems)必须处于活动状态,否则它将被垃圾收集器释放,并且不会引发任何事件。 通常的模式是引入您自己的包装器类,该类将有问题的COM对象(项)作为构造函数参数,将其存储在类成员中并设置事件处理程序。然后,您可以为每个收件箱文件夹创建包装器类,并将每个包装器存储在列表中。必须在类级别声明该列表,以确保它(及其项)在InitialOutlookConfiguration()完成时保持活动状态

public List myInboxMailItems=new List();
    public List<Outlook.Items> myInboxMailItems = new List<Outlook.Items>();
    public Items InboxMails;


    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        //watch.Start();
        //chequear el orden en que solicitamos la ejecucion de la configuracion
        //this.Application.Startup += new Outlook.ApplicationEvents_11_StartupEventHandler(OnOutlookOutlookStartup);
        Outlook.Accounts myAccounts = this.Application.GetNamespace("MAPI").Accounts;
        foreach (Outlook.Account myAccount in myAccounts)
        {
            Outlook.MAPIFolder inbox = myAccount.DeliveryStore.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
            myInboxMailItems.Add(inbox.Items);

            foreach (Outlook.Items i in myInboxMailItems)
            {
                i.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(test);
            }
        }
    }


    public void test(object i)
    {
        System.Windows.Forms.MessageBox.Show("Eureka!");
    }
邮件中的公共物品; 私有void ThisAddIn_启动(对象发送方,System.EventArgs e) { //watch.Start(); //在结构设计方面的要求 //this.Application.Startup+=新建Outlook.ApplicationEvents\u 11\u StartupEventHandler(OnOutlookOutStartup); Outlook.Accounts myAccounts=this.Application.GetNamespace(“MAPI”).Accounts; foreach(Outlook.Account myAccount在myAccounts中) { Outlook.MapipFolder inbox=myAccount.DeliveryStore.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 添加(inbox.Items); foreach(myInboxMailItems中的Outlook.Items i) { i、 ItemAdd+=新Outlook.ItemsEvents\u ItemAddEventHandler(测试); } } } 公共无效测试(对象i) { System.Windows.Forms.MessageBox.Show(“Eureka!”); }

以防有人坚持同样的问题,感谢Dimitry对垃圾收集器的洞察

当你只订阅一个帐户和一个收件箱时,它能工作吗?我做了,但它不工作。
    public List<Outlook.Items> myInboxMailItems = new List<Outlook.Items>();
    public Items InboxMails;


    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        //watch.Start();
        //chequear el orden en que solicitamos la ejecucion de la configuracion
        //this.Application.Startup += new Outlook.ApplicationEvents_11_StartupEventHandler(OnOutlookOutlookStartup);
        Outlook.Accounts myAccounts = this.Application.GetNamespace("MAPI").Accounts;
        foreach (Outlook.Account myAccount in myAccounts)
        {
            Outlook.MAPIFolder inbox = myAccount.DeliveryStore.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
            myInboxMailItems.Add(inbox.Items);

            foreach (Outlook.Items i in myInboxMailItems)
            {
                i.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(test);
            }
        }
    }


    public void test(object i)
    {
        System.Windows.Forms.MessageBox.Show("Eureka!");
    }