Microsoft.Office.Interop.Word 内存泄漏在文件创建时

本文关键字:文件创建 泄漏 内存 Office Interop Word Microsoft | 更新日期: 2023-09-27 17:57:18

我有这样的类:

    public class WordInteropFileCreator
{
    public void CreateWordDocument(object fileName, object saveAs, string clientFullName, ClientAdressInfo clientAdressInfo)
    {
        //Set Missing Value parameter - used to represent
        // a missing value when calling methods through
        // interop.
        object missing = System.Reflection.Missing.Value;
        //Setup the Word.Application class.
        Word.Application wordApp = new Word.ApplicationClass();
        //Setup our Word.Document class we'll use.
        Word.Document aDoc = null;
        // Check to see that file exists
        if (File.Exists((string)fileName))
        {
            DateTime today = DateTime.Now;
            object readOnly = false;
            object isVisible = false;
            //Set Word to be not visible.
            wordApp.Visible = false;
            //Open the word document
            aDoc = wordApp.Documents.Open(ref fileName, ref missing,
                ref readOnly, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref isVisible, ref missing, ref missing,
                ref missing, ref missing);
            // Activate the document
            aDoc.Activate();
            // Find Place Holders and Replace them with Values.
            this.FindAndReplace(wordApp, "<name>", clientFullName);
            this.FindAndReplace(wordApp, "<address>", clientAdressInfo.GetStreetWithNumber());
            this.FindAndReplace(wordApp, "<city>", clientAdressInfo.GetCityWithPostalCode());
            this.FindAndReplace(wordApp, "<country>",clientAdressInfo.CountryCode != null && clientAdressInfo.CountryCode.ToUpper() == "PL" ? "  " : clientAdressInfo.CountryName);
        }
        else
        {
            throw  new Exception("File dose not exist " + fileName);
        }
        //object outputFileName = fileName.Replace(".doc", ".pdf");
        object fileFormat = Word.WdSaveFormat.wdFormatPDF;
        //Save the document as the correct file name.
        aDoc.SaveAs(ref saveAs, ref fileFormat, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing);
        object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
        //Close the document - you have to do this.
        aDoc.Close(ref saveChanges, ref missing, ref missing);
    }
    /// <summary>
    /// This is simply a helper method to find/replace 
    /// text.
    /// </summary>
    /// <param name="WordApp">Word Application to use</param>
    /// <param name="findText">Text to find</param>
    /// <param name="replaceWithText">Replacement text</param>
    private void FindAndReplace(Word.Application WordApp,
                                object findText,
                                object replaceWithText)
    {
        object matchCase = true;
        object matchWholeWord = true;
        object matchWildCards = false;
        object matchSoundsLike = false;
        object nmatchAllWordForms = false;
        object forward = true;
        object format = false;
        object matchKashida = false;
        object matchDiacritics = false;
        object matchAlefHamza = false;
        object matchControl = false;
        object read_only = false;
        object visible = true;
        object replace = 2;
        object wrap = 1;
        WordApp.Selection.Find.Execute(ref findText,
            ref matchCase, ref matchWholeWord,
            ref matchWildCards, ref matchSoundsLike,
            ref nmatchAllWordForms, ref forward,
            ref wrap, ref format, ref replaceWithText,
            ref replace, ref matchKashida,
            ref matchDiacritics, ref matchAlefHamza,
            ref matchControl);
    }
}

我像这样使用它:

                string firstPart = Path.Combine(reportPathDir, "first.pdf");
                string letterPath = Path.Combine(reportPathDir, repType);
                var creator = new WordInteropFileCreator();
                creator.CreateWordDocument(letterPath, firstPart, logicResult.SpecifcationClients[0].FullName, logicResult.ClientAdressInfo);
                var fs = new FileStream(secondPart, FileMode.OpenOrCreate);
                fs.Write(bytes, 0, bytes.Length);
                fs.Close();
                fs.Dispose();

当我使用此代码编写许多控制台应用程序时,我遇到了内存泄漏。有什么建议吗?var creator = new WordInteropFileCreator() 没有 dispose 方法。

Microsoft.Office.Interop.Word 内存泄漏在文件创建时

与现有答案类似,但完成了您的方法。这应该在文档关闭后立即退出。

Word应用程序的退出方法:

wordApp.Quit();
  • 提示:退出方法不需要任何输入参数。

您应该在代码后退出Word Application

public void CreateWordDocument(object fileName, object saveAs, string clientFullName, ClientAdressInfo clientAdressInfo)
{
    //Set Missing Value parameter - used to represent
    // a missing value when calling methods through
    // interop.
    object missing = System.Reflection.Missing.Value;
    //Setup the Word.Application class.
    Word.Application wordApp = new Word.ApplicationClass();
    //Setup our Word.Document class we'll use.
    Word.Document aDoc = null;
    // Check to see that file exists
    if (File.Exists((string)fileName))
    {
        DateTime today = DateTime.Now;
        object readOnly = false;
        object isVisible = false;
        //Set Word to be not visible.
        wordApp.Visible = false;
        //Open the word document
        aDoc = wordApp.Documents.Open(ref fileName, ref missing,
            ref readOnly, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing,
            ref missing, ref isVisible, ref missing, ref missing,
            ref missing, ref missing);
        // Activate the document
        aDoc.Activate();
        // Find Place Holders and Replace them with Values.
        this.FindAndReplace(wordApp, "<name>", clientFullName);
        this.FindAndReplace(wordApp, "<address>", clientAdressInfo.GetStreetWithNumber());
        this.FindAndReplace(wordApp, "<city>", clientAdressInfo.GetCityWithPostalCode());
        this.FindAndReplace(wordApp, "<country>",clientAdressInfo.CountryCode != null && clientAdressInfo.CountryCode.ToUpper() == "PL" ? "  " : clientAdressInfo.CountryName);
    }
    else
    {
        throw  new Exception("File dose not exist " + fileName);
    }
    //object outputFileName = fileName.Replace(".doc", ".pdf");
    object fileFormat = Word.WdSaveFormat.wdFormatPDF;
    //Save the document as the correct file name.
    aDoc.SaveAs(ref saveAs, ref fileFormat, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing);
    object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
    //Close the document - you have to do this.
    aDoc.Close(ref saveChanges, ref missing, ref missing);
    wordApp.Quit();
}

您没有关闭 Word,因此它将在后台继续运行:在处理结束时调用它。

wordApp.Quit(ref nullObj, ref nullObj, ref nullObj);