/ / GetOccurrence löst immer eine Ausnahme aus - vb.net, Outlook, Office-Interop

GetOccurrence löst immer Ausnahme aus - vb.net, Outlook, Office-Interop

Ich habe versucht, Termine zu bekommenOutlook über die Outlook-Interop-Klassen. Insbesondere solche, bei denen es sich um wiederkehrende Termine handelt. Ich habe versucht, sowohl Version 12 als auch Version 14 der Interop-Bibliotheken mit den gleichen Ergebnissen zu verwenden. Der folgende Code führt für mich immer zur gleichen Ausnahme.

Code:

Dim pattern As Outlook.RecurrencePattern = appt.GetRecurrencePattern()
Dim recur As Microsoft.Office.Interop.Outlook.AppointmentItem = Nothing
recur = rp.GetOccurrence(Now())

Ausnahme:

Sie haben eine der Wiederholungen dieses Elements geändert, und diese Instanz-Nr Länger existiert. Schließen Sie alle offenen Posten und versuchen Sie es erneut.

Hinweis: Ich habe unterschiedliche Werte für den Parameter für GetOccurrence verwendet, ich verwende nur "now ()", um den Code / das Problem zu vereinfachen. Daher glaube ich nicht, dass das Problem in der Verwendung von Now () liegt. Ich habe DateTime.Parse ("28.08.2012") oder DateTime.Parse ("28.08.2012, 17:00 Uhr") mit der Namensausnahme ausprobiert geworfen.

Ich habe Beispiele von hier angeschaut: Frage 1, Frage 2. Keiner scheint das gleiche Problem zu haben. Ich habe jede Permutation ausprobiert, um Objekte zu schließen, sie freizugeben und sie auf null zu setzen (nichts). (z.B. Microsoft Office Interop - Tricks und Traps). Ich habe Beispiele direkt von MSDN kopiert und eingefügt (z. B .: MDSN) mit den gleichen Ergebnissen. Mir fehlen die Ideen!

Ich verwende das 64-Bit-Betriebssystem Windows Server 2008 R2 mit Visual Studio 2010, .NET 4.0 und Outlook 2007.

Hier ist ein vollständigeres Codebeispiel, das für mich immer die Ausnahme auslöst:

    Public Sub TestOutlook()
Dim oApp As Outlook.Application = Nothing
Dim mapiNamespace As Outlook.[NameSpace] = Nothing
Dim calFolder As Outlook.MAPIFolder = Nothing
Dim calItems As Outlook.Items = Nothing

oApp = New Outlook.Application()
mapiNamespace = oApp.GetNamespace("MAPI")
calFolder = mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
calItems = calFolder.Items
calItems.IncludeRecurrences = True

For itemIndex As Integer = 1 To calItems.Count

Dim item As Outlook.AppointmentItem = Nothing
item = calFolder.Items.Item(itemIndex)

If item.IsRecurring Then
Dim rp As Outlook.RecurrencePattern = Nothing
rp = item.GetRecurrencePattern()
item.Close(Outlook.OlInspectorClose.olDiscard)
CleanUpComObject(item)
item = Nothing
GC.Collect()

Try
rp.GetOccurrence(Now)
Catch ex As System.Exception
Debug.WriteLine("Ex with GetOccurrence: " & ex.Message)
End Try

End If
If item IsNot Nothing Then item.Close(Outlook.OlInspectorClose.olDiscard)
CleanUpComObject(item)
item = Nothing
GC.Collect()
Next

CleanUpComObject(calItems)
CleanUpComObject(calFolder)
CleanUpComObject(mapiNamespace)
oApp.Quit()
CleanUpComObject(oApp)
GC.Collect()
End Sub

Private Sub CleanUpComObject(obj As Object)
Try
If obj IsNot Nothing AndAlso System.Runtime.InteropServices.Marshal.IsComObject(obj) Then
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj)
obj = Nothing
End If
Catch ex As System.Exception
Debug.WriteLine("Exception in Clean up: " & ex.Message)
End Try
End Sub

Vielen Dank

Antworten:

7 für die Antwort № 1

Ich hatte mit genau dem gleichen Problem zu kämpfenfür die letzten paar Stunden, und schließlich bin ich zu einer Lösung gekommen. Es scheint, als würde GetOccurrence () diesen Fehler immer auslösen, es sei denn, der übergebene DateTime-Wert stimmt mit einer Instanz des wiederkehrenden Termins überein. Was mich jedoch auffiel, war, dass der DateTime-Wert an beiden Daten übereinstimmen muss UND Zeit.

Hier ist eine Version Ihres Codes, die einige Zeit in Anspruch nimmtaus dem RecurrencePattern und fügt es dem an GetOccurence () übergebenen DateTime-Wert hinzu, der dann alle Instanzen des Termins, die auf das ausgewählte Datum fallen, korrekt finden sollte.

Dim item As Outlook.AppointmentItem = Nothing
item = calFolder.Items.Item(itemIndex)

If item.IsRecurring Then
Dim rp As Outlook.RecurrencePattern = Nothing
rp = item.GetRecurrencePattern()

Dim dt2 as DateTime = DateTime.Parse("8/28/2012")
dt2 = dt2.AddHours(item.Start.Hour)
dt2 = dt2.AddMinutes(item.Start.Minute)
dt2 = dt2.AddSeconds(item.Start.Second)

item.Close(Outlook.OlInspectorClose.olDiscard)
CleanUpComObject(item)
item = Nothing
GC.Collect()

Try
rp.GetOccurrence(dt2)

Catch ex1 As System.Runtime.InteropServices.COMException

// Do Nothing, let this error go.  No instance of the appointment falls on this date.

Catch ex As System.Exception
Debug.WriteLine("Ex with GetOccurrence: " & ex.Message)
End Try

End If

Beachten Sie, dass ich ein C # -Entwickler bin. Daher kann es in den obigen Abschnitten zu Syntaxfehlern kommen, da der OP-Code und mein Code aus C # zusammengeführt und nicht durch einen Compiler weitergeleitet wurden.