2012-03-01 17 views
1

ExcelをGeneartingするためにEXCEL interopを使用しています。その後、添付ファイルとして添付してmail.Afterメールを送信します。削除にはエラーを投げている:C#アプリケーションでExcel Interopオブジェクトの参照を削除する方法

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 references.butを削除しています: 私のコードは次のようである:

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("[email protected]", "[email protected]", "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"); 

メールにそれを取り付けた後の参照を削除する方法。 おかげ

+1

finallyブロックにすべてのコードがありますか? – Steve

+0

これは単なるサンプルコードです。 – Pranav

+1

それはExcelではない、それは添付ファイルだ - http://stackoverflow.com/questions/5191449/file-locked-after-sending-it-as-attachement – dash

答えて

1
ちょうどme.hereのため正常に動作してメールを送信した後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("[email protected]", "[email protected]", "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"); 
+0

ハ - 私たちはほぼ同じ時間に投稿しましたが、あなたは本当にあなた自身の問題を解決しました。 +1。 – dash

1

はMailMessageとSmtpClientはそれをやって、配置されるべき、はMailMessageは、また処分添付ファイル。

using(SmtpClient client = new SmtpClient("smtp.gmail.com", 587)) 
using(MailMessage mm = new MailMessage("[email protected]", "[email protected]", "TestMsg", "Hi")) 
{ 

    client.Credentials = CredentialCache.DefaultNetworkCredentials; 
    client.Send(mm); 
} 
+0

私は愚かな間違いをしていた... + 1あなたのために。 – Pranav

関連する問題