タイトル : Re^2: SeriesCollection.Add後、Excelのタスクが残る 投稿日 : 2020/01/29(Wed) 02:26 投稿者 : OrientalMelody
魔界の仮面弁士様 大変ありがとうございます。 FinalReleaseComObject を使えば、カウント数は消えるようですね。 提示したサンプルは、これで完璧にExcelのタスクは消えるようになりました。 具体的には、 ObjRelease関数を以下のように書き換えました。 ''' <summary> ''' Excelオブジェクトの完全な解放 ''' </summary> ''' <param name="obj">Excelオブジェクト</param> Sub ObjRelease(ByRef obj As Object) If Not (obj Is Nothing) Then 'Marshal.ReleaseComObject(obj) Dim intCountRCW As Integer = Marshal.ReleaseComObject(obj) Debug.WriteLine("intCountRCW = {0}", intCountRCW) If intCountRCW > 0 Then Dim intCountRCWFinal As Integer = Marshal.FinalReleaseComObject(obj) Debug.WriteLine("intCountRCWFinal = {0}", intCountRCWFinal) End If obj = Nothing Threading.Thread.Sleep(3) '2019/12/31 End If End Sub 提示したサンプルでは、Finally句の ObjRelease(rngObj) のところで、 intCountRCW = 1 となりました。 SeriesCollectionObj.Add(Source:=rngObj) の引数の方だったのですね。 業務アプリにも反映しようとしたのですが、 例えば、今回修正したFinalReleaseComObjectつきのObjRelease関数を使用して、 Dim xlAppObj As Application = Nothing Dim wbksObj As Workbooks = Nothing Dim wbkObj As Workbook = Nothing Dim wstsObj As Sheets = Nothing xlAppObj = New Application() xlAppObj.Visible = True wbksObj = xlAppObj.Workbooks wbkObj = wbksObj.Add() wstsObj = wbkObj.Worksheets Dim wstObj1 as As Worksheet = Nothing Dim wstObj2 as As Worksheet = Nothing wstObj1 = wstsObj(1) wstObj2 = wstsObj(1) ObjRelease(wstObj1) wstObj2 .Activate みたいなことをすると 「System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used. at System.StubHelpers.StubHelpers.StubRegisterRCW(Object pThis) at Microsoft.Office.Interop.Excel._Worksheet.Activate()」 エラーが発生するようになりました。 これは、 wstObj1 を FinalReleaseComObject すると、 wstObj2 の参照も消えてしまうのですね。 Sub ObjRelease(Of T)(ByRef obj As T) の記述もこれから行ってみます。 とりあえず、ご連絡まで。 |