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)
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