如何在C#Application中删除Excel Interop对象引用

时间:2012-03-01 12:30:05

标签: c# excel email com email-attachments

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

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

我搜索了SO和其他网站,发现了有关COM组件的有趣事实     参考: - How do I properly clean up Excel interop objects?

如果我没有将其作为附件附加,则文件将被删除。删除之前我删除所有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");

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

2 个答案:

答案 0 :(得分:1)

发送邮件后添加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");

答案 1 :(得分:1)

应该处理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); 
}