Как удалить ссылки на объекты Excel Interop в приложении C # - PullRequest
1 голос
/ 01 марта 2012

Я использую EXCEL interop для генерации Excel, а затем прикрепляю его как вложение к почте, а затем отправляю почту. После отправки почты я хочу удалить созданный файл. При удалении выдает ошибку:

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

Я искал на 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");

как удалить ссылки после прикрепления его к почте. Спасибо

Ответы [ 2 ]

1 голос
/ 01 марта 2012

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); 
}
1 голос
/ 01 марта 2012

Просто добавление 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");
...