2017-05-04 2 views
0

Je développe un complément Office VSTO en C# qui recherche les rendez-vous du calendrier dans Outlook et y lit/écrit des données.C# Outlook Erreur de complément VSTO lors de la tentative d'obtention d'un élément dans une configuration Exchange

Récemment, l'un des clients avaient des problèmes avec le complément, à savoir qu'ils ne peuvent pas lire/écrire le rendez-vous du calendrier, et il jette une exception:

L'opération a échoué.

Il n'y a pas beaucoup d'informations du journal des exceptions, mais je soupçonne qu'ils ont des problèmes de synchronisation avec Exchange.

J'ai demandé au client, et ils ont dit, qu'ils ont aussi une popup aléatoire dans Outlook, ce qui arrive parfois quand il y a une mésaventure lors de la synchronisation avec Exchange. Je leur ai dit de «réparer» les fichiers de données Outlook, mais cela n'a pas résolu le problème.

Les éléments Outlook sont essentiellement regardé en fonction de leurs perspectives ENTRYID s ou sujet (les sujets sont uniques, et par souci de simplicité, je traduit le code un peu)

...main alghorythm... 
    Outlook.AppointmentItem calAppointment = null; 
    calAppointment = SearchforCalendarMatch(EntryID, Subject); //we try to find either by EntryID or by Subject 
    if (calAppointment != null) 
    { 
     calAppointment.Start = StartDate; 
     calAppointment.End = FinishDate; 
     calAppointment.Body = Notes; 
     calAppointment.Save(); //we're changing the found calendar appointment here 
    } 
... 

public Outlook.AppointmentItem SearchforCalendarMatch(String EntryID, String Subject) 
{ 
    Outlook.NameSpace ns = null; 
    Outlook.MAPIFolder calendarFolder = null; 
    Outlook.Items calendarFolderItems = null; 
    Outlook.Items filteredcalendarFolderItems = null; 
    Outlook.AppointmentItem calAppointment = null; 

    Outlook.Application OutlookApp = new Outlook.Application(); 
    outlookversion = OutlookApp.Version; 
    ns = OutlookApp.Session; 

    //Try to find the calendar appointment by the EntryID 
    dynamic OutlookItem = ns.GetItemFromID(t.Text28); 
    if (OutlookItem != null) 
    { 
     if (OutlookItem is Outlook.AppointmentItem) 
     { 
      Outlook.AppointmentItem foundItem = (Outlook.AppointmentItem)OutlookItem; 
      return foundItem; 
     } 
    } 

    //If the EntryID was missing, we try to find the calendar appointment by the Subject. 
    //(original code is very long, and there are multiple things here, but let's just assume that 100% sure that the subject is unique, so it will find it) 
    String SubjectMatch = "[Subject] = '" + Subject + "'"; 
    filteredcalendarFolderItems = calendarFolderItems.Restrict(SubjectMatch); 
    for (int i = 1; i <= filteredcalendarFolderItems.Count; i++) 
    { 
     //appointment has to be one of these 
     calAppointment = (Microsoft.Office.Interop.Outlook.AppointmentItem)filteredcalendarFolderItems[i]; 
     if (!calAppointment.IsConflict) //conflict check here, not sure if it helps at all 
     { 
      return calAppointment; //this is not the complete code, but this is the basic idea of it. 
     } 
    } 
} 

Tous des idées comment je pourrais rendre l'application reconnaître ces synchronisations Exchange échouées, et les gérer différemment?

Je voudrais encore synchroniser dans ces cas, s'il est possible ... (changer les « données locales » dans Outlook, puis laissez Outlook gèrent tout de celui sur)

Répondre

0

Vous devez libérer les objets COM sous-jacents immédiatement. Utilisez System.Runtime.InteropServices.Marshal.ReleaseComObject pour libérer un objet Outlook lorsque vous avez fini de l'utiliser. Cela est particulièrement important si votre complément tente d'énumérer plus de 256 éléments Outlook dans une collection stockée sur un serveur Microsoft Exchange. Si vous ne libérez pas ces objets en temps opportun, vous pouvez atteindre la limite imposée par Exchange sur le nombre maximal d'éléments ouverts à la fois. Puis définissez une variable à Nothing en Visual Basic (null en C#) pour libérer la référence à l'objet. En savoir plus à ce sujet dans l'article Systematically Releasing Objects.

+0

Bonjour Eugene! Où exactement devrais-je implémenter le ReleaseComObject, dans mon code ci-dessus? En outre, n'est-ce pas fondamentalement seulement valide pour la partie inférieure, où je traverse réellement la collection? Et devrais-je 'libérer' tous les objets Excel? Qu'en est-il de celui que je retourne? – Laureant