如何终止Excel复制粘贴后遗留的C#后台进程?
Excel后台进程残留问题(.NET Core 6.0 + Windows 10)
之前没意识到在C#中复制粘贴Worksheet内容会导致Excel后台进程残留,但现在确实碰到了这个问题。我在Windows 10系统上使用.NET Core 6.0,执行复制数据的代码后,任务管理器里会留下无法正常终止的Excel进程;但只要注释掉复制相关代码,Excel就能正常释放对象并关闭。试过用Marshal.FinalReleaseComObject和GC.Collect也没用,猜测是某个COM对象没正确释放,但排查多次都没解决,求帮忙。
复现代码
using Reporting_WPF_Library; using Microsoft.Office.Interop.Excel; using Marshal = System.Runtime.InteropServices.Marshal; using Excel = Microsoft.Office.Interop.Excel; using Microsoft.Office.Interop.Outlook; using Outlook = Microsoft.Office.Interop.Outlook; using System.Windows.Navigation; using System.Windows; using ADODB; using System.Diagnostics; static void RevenueNotPosted() { string SavePath = @"Z:\Reporting\Revenue Reports\XMonthly\Revenue Not Posted\"; Excel.Application XLApp = XL.App(true); Outlook.Application OLApp = OL.App(); Excel.Workbooks XLWB = XLApp.Workbooks; Excel.Workbook? Report = XL.FileRef(XLWB, SavePath, "Revenue Not Posted", CheckAge: -1) ?? throw new System.Exception("RevenueNotPosted failure: FileRef on Report"); Excel.Workbook? Data = XL.FileRef(XLWB, SavePath, "Dataset", ".csv", CheckAge: -1) ?? throw new System.Exception("RevenueNotPosted failure: FileRef on Data"); // 就是这行代码导致问题,注释掉就一切正常 // 试过用复制粘贴的方式,问题依然存在 Report.Worksheets["Report"].Columns["A:S"] = Data.Worksheets[1].Columns["A:S"].Value; XL.Rel(XLApp, ref Data, false); XL.Rel(XLApp, ref Report, false); Marshal.ReleaseComObject(XLWB); XLApp.Quit(); Marshal.ReleaseComObject(OLApp); Marshal.ReleaseComObject(XLApp); XL.TryGettingAReservationAtDorsiaNow(); } RevenueNotPosted();
释放工作簿的Rel函数
public static void Rel(Excel.Application XLApp, ref Workbook? WB, bool SaveBeforeClosing = true) { if (WB == null) return; Properties(XLApp, true); if (SaveBeforeClosing == true) SaveBeforeClosing = !WB.Saved; WB.Close(SaveChanges: SaveBeforeClosing); Marshal.ReleaseComObject(WB); WB = null; return; }
内容的提问来源于stack exchange,提问作者Colin Gifford
相关产品推荐
相关产品推荐

