提问人:Maxim Gershkovich 提问时间:7/21/2011 最后编辑:CommunityMaxim Gershkovich 更新时间:11/8/2019 访问量:78681
释放 Microsoft.Office.Interop.Word.Application
Disposing of Microsoft.Office.Interop.Word.Application
问:
(该帖子的后续内容(仍未回复):https://stackoverflow.com/q/6197829/314661)
使用以下代码
Application app = new Application();
_Document doc = app.Documents.Open("myDocPath.docx", false, false, false);
doc.PrintOut(false);
doc.Close();
我正在尝试以编程方式打开和打印文件。
问题是每次我运行上述代码时,都会启动一个新的WINWORD.exe进程,显然这会很快耗尽所有内存。
应用程序类似乎不包含 dispose/close 或类似的方法。
经过一番研究,我(意识到)并将代码更改为以下内容。
Application app = new Application();
_Document doc = app.Documents.Open(fullFilePath + ".doc", false, false, false);
doc.PrintOut(false);
doc.Close();
int res = System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
int res1 = System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
我可以看到剩余的引用计数为零,但进程仍然存在?
PS:我正在使用 Microsoft.Office.Interop 库的版本 14。
答:
也许可以尝试设置和调用doc = null
GC.Collect()
编辑,不是我自己的代码,我忘记了我从哪里得到它,但这是我用来处理 Excel 的,它可以完成这项工作,也许你可以从中收集一些东西:
public void DisposeExcelInstance()
{
app.DisplayAlerts = false;
workBook.Close(null, null, null);
app.Workbooks.Close();
app.Quit();
if (workSheet != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
if (workBook != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
if (app != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
workSheet = null;
workBook = null;
app = null;
GC.Collect(); // force final cleanup!
}
评论
GC.Collect()
Marshal.ReleaseComObject()
我关闭文档,然后关闭对我有用的应用程序,然后强制垃圾回收。
// Document
object saveOptionsObject = saveDocument ? Word.WdSaveOptions.wdSaveChanges : Word.WdSaveOptions.wdDoNotSaveChanges;
this.WordDocument.Close(ref saveOptionsObject, ref Missing.Value, ref Missing.Value);
// Application
object saveOptionsObject = Word.WdSaveOptions.wdDoNotSaveChanges;
this.WordApplication.Quit(ref saveOptionsObject, ref Missing.Value, ref Missing.Value);
GC.Collect();
GC.WaitForPendingFinalizers();
评论
GC.Collect()
Marshal.ReleaseComObject()
你不需要打电话吗?Quit
app.Quit();
评论
Application
您需要调用才能关闭应用程序。我使用了下面的代码,它对我来说就像一个魅力 -app.Quit()
try
{
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
wordApp.Visible = false;
Microsoft.Office.Interop.Word.Document doc = null;
//Your code here...
doc.Close(false); // Close the Word Document.
wordApp.Quit(false); // Close Word Application.
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + " " + ex.InnerException);
}
finally
{
// Release all Interop objects.
if (doc != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
if (wordApp != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
doc = null;
wordApp = null;
GC.Collect();
}
评论
GC.Collect()
Marshal.ReleaseComObject()
最好的解决方案..最后:
try {
Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application();
appWord.Visible = false;
Microsoft.Office.Interop.Word.Document doc = null;
wordDocument = appWord.Documents.Open((INP), ReadOnly: true);
wordDocument.ExportAsFixedFormat(OUTP, Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF);
// doc.Close(false); // Close the Word Document.
appWord.Quit(false); // Close Word Application.
} catch (Exception ex) {
Console.WriteLine(ex.Message + " " + ex.InnerException);
}
试试这个..
doc.Close(false);
app.Quit(false);
if (doc != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
if (app != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
doc = null;
app = null;
GC.Collect();
我认为似乎没有人注意到的主要问题是,如果 Word 已经打开,您首先不应该创建新的 Application 对象。 我们这些从 COM 和/或 VB6 时代就开始编码的人会记得 GetActiveObject。幸运的是,.Net 只需要 ProgID。
建议的执行方法如下:
try
{
wordApp = (word.Application) Marshal.GetActiveObject("Word.Application");
}
catch(COMException ex) when (ex.HResult == -2147221021)
{
wordApp = new word.Application();
}
评论
同意其他海报,并且不需要。如果该进程在运行后仍然存在,则可能是因为您正在不可见地运行应用程序,并且存在阻止应用程序关闭的提示,例如“文档恢复”对话框。如果是这种情况,则需要在创建应用程序时添加此内容。GC.Collect()
Marshal.ReleaseComObject()
app.Quit(false)
app.DisplayAlerts = false;
上一个:为什么存在 async 关键字
下一个:使用 CSS 垂直拆分页面
评论