SSIS包中执行VB代码时Excel进程无法在任务管理器终止的问题
解决SSIS中移除Excel密码后Excel进程无法终止的问题
问题根源在于使用Office Interop时,隐式创建的COM对象未被显式释放,加上.NET垃圾回收的延迟机制,导致Excel进程残留无法自动终止。以下是修正后的代码及关键说明:
修正后的VB代码
Dim excelapp As New Microsoft.Office.Interop.Excel.Application Dim workbooks As Microsoft.Office.Interop.Excel.Workbooks '显式声明Workbooks集合对象 Dim newWorkbook As Microsoft.Office.Interop.Excel.Workbook '获取加密Excel文件 excelapp.Visible = False workbooks = excelapp.Workbooks newWorkbook = workbooks.Open( File_Name, 0, True, 5, password, "", False, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", True, False, 0, True, False, False ) '生成临时文件路径(修正原格式字符串的空格问题) TempExcelFileName = String.Format("_{0}", Path.GetFileName(File_Name)) TempExcelFilePath = String.Format("{0}/{1}", Path.GetDirectoryName(File_Name), TempExcelFileName) '保存无密码的临时文件 newWorkbook.SaveAs( TempExcelFilePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, "", "", False, False, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing ) '逐步释放COM对象 newWorkbook.Close() System.Runtime.InteropServices.Marshal.ReleaseComObject(newWorkbook) newWorkbook = Nothing System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks) workbooks = Nothing excelapp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(excelapp) excelapp = Nothing '强制触发垃圾回收,清理残留引用 GC.Collect() GC.WaitForPendingFinalizers() '替换原文件 File.Delete(File_Name) File.Move(TempExcelFilePath, File_Name)
关键修改点说明
- 显式释放Workbooks集合:原代码直接调用
excelapp.Workbooks.Open会隐式创建Workbooks COM对象,该对象未被释放是进程残留的核心原因,显式声明后可手动释放。 - 变量置空+强制垃圾回收:释放COM对象后将变量设为
Nothing,再调用GC.Collect()和GC.WaitForPendingFinalizers(),强制.NET清理托管引用,确保COM对象引用计数归0。 - 修正格式字符串错误:原代码生成的临时文件名带多余空格,修正后避免文件操作异常。
- 调整操作顺序:确保所有COM资源清理完成后再执行文件操作,避免资源占用冲突。
内容的提问来源于stack exchange,提问作者PRITESH WANI
相关产品推荐
相关产品推荐

