Outlook 相互運用クラスを介して Outlook から予定を取得しようとしています。具体的には、定期的な予定です。相互運用ライブラリの v12 と v14 の両方を使用してみましたが、結果は同じでした。次のコードでは、常に同じ例外が発生します。
コード:
Dim pattern As Outlook.RecurrencePattern = appt.GetRecurrencePattern()
Dim recur As Microsoft.Office.Interop.Outlook.AppointmentItem = Nothing
recur = rp.GetOccurrence(Now())
例外:
このアイテムの繰り返しの 1 つを変更したため、このインスタンスはもう存在しません。開いているアイテムを閉じて、もう一度やり直してください。
注: GetOccurrence のパラメーターに異なる値を使用しました。コード/問題を単純化するために「now()」のみを使用しています。したがって、Now() の使用に問題があるとは思いません。DateTime.Parse("8/28/2012") または DateTime.Parse("8/28/2012 5:00pm") という名前の例外をスローしてみました。
ここからサンプルを見てきました: Question 1、Question 2。どちらも同じ問題を抱えているようには見えません。オブジェクトを閉じる、解放する、無効にする (何もしない) というあらゆる順列を試しました。(例: Microsoft Office Interop - トリックとトラップ)。MSDN (例: MDSN ) から直接例をコピーして貼り付け、同じ結果が得られました。私は完全にアイデアがありません!
Windows Server 2008 R2 64 ビット OS で、Visual Studio 2010、.NET 4.0、Outlook 2007 を使用しています。
これは、常に例外をスローするより完全なコード例です。
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
ありがとう