如何在C#应用程序中删除Excel Interop对象引用

我正在使用EXCEL interop来生成Excel,然后我将它作为附件附加到邮件然后发送邮件。发送邮件后,我想删除生成的文件。 在删除它是抛出错误:

this file cannot be deleted as it is is used by another process 

我search了SO和其他网站,发现有关COM组件的有趣事实。
参考: 如何正确清理Excel互操作对象?

如果我不附加它作为附件然后文件被删除。 删除之前,我删除所有的COM引用。但是,当我使用它作为附件它是抛出错误:我的代码是这样的:

  workbook.SaveAs(root + statics + ".xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing); // Garbage collecting // Clean up references to all COM objects // As per above, you're just using a Workbook and Excel Application instance, so release them: GC.Collect(); GC.WaitForPendingFinalizers(); Marshal.FinalReleaseComObject(m_objRange); Marshal.FinalReleaseComObject(worksheet); workbook.Close(false, Type.Missing, Type.Missing); Marshal.FinalReleaseComObject(workbook); app.Quit(); Marshal.FinalReleaseComObject(app); MailMessage mm = new MailMessage("def@gmail.com", "xyz@gmail.com", "TestMsg", "Hi"); SmtpClient client = new SmtpClient("smtp.gmail.com", 587); client.Credentials = CredentialCache.DefaultNetworkCredentials; //Commenting Below two lines works fine ....!!!!!!!!!....WHY..??? //Attachment data = new Attachment(root + statics + ".xls"); //mm.Attachments.Add(data); client.Send(mm); File.Delete(root + statics + ".xls"); 

附加到邮件后如何删除引用。 谢谢

只是在发送邮件后添加data.Dispose()对我来说工作正常。有修改代码:

 workbook.SaveAs(root + statics + ".xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing); // Garbage collecting // Clean up references to all COM objects // As per above, you're just using a Workbook and Excel Application instance, so release them: GC.Collect(); GC.WaitForPendingFinalizers(); Marshal.FinalReleaseComObject(m_objRange); Marshal.FinalReleaseComObject(worksheet); workbook.Close(false, Type.Missing, Type.Missing); Marshal.FinalReleaseComObject(workbook); app.Quit(); Marshal.FinalReleaseComObject(app); MailMessage mm = new MailMessage("def@gmail.com", "xyz@gmail.com", "TestMsg", "Hi"); SmtpClient client = new SmtpClient("smtp.gmail.com", 587); client.Credentials = CredentialCache.DefaultNetworkCredentials; Attachment data = new Attachment(root + statics + ".xls"); mm.Attachments.Add(data); //Now Working Fine:- data.Dispose(); client.Send(mm); File.Delete(root + statics + ".xls"); 

MailMessage和SmtpClient应该被处置,这样做,MailMessage,也处置任何附件。

 using(SmtpClient client = new SmtpClient("smtp.gmail.com", 587)) using(MailMessage mm = new MailMessage("def@gmail.com", "xyz@gmail.com", "TestMsg", "Hi")) { client.Credentials = CredentialCache.DefaultNetworkCredentials; client.Send(mm); }