首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WinWord.exe在调用Word.Documents.Add - Word .NET互操作后不会退出

WinWord.exe在调用Word.Documents.Add - Word .NET互操作后不会退出
EN

Stack Overflow用户
提问于 2010-03-25 05:15:28
回答 11查看 24K关注 0票数 20

我遇到了一个典型的场景,即在.NET中创建Word COM对象(通过Microsoft.Office.Interop.Word程序集)时,即使我是properly closing and releasing the objects,WinWord进程也不会退出。

我已经将范围缩小到使用Word.Documents.Add()方法。我可以通过其他方式使用Word而不会出现问题(打开文档、修改内容等),当我告诉WinWord.exe退出时,它会退出。只有一次我使用Add()方法(并且只有在添加模板时),这个过程才会继续运行。

下面是一个简单的例子,它再现了这个问题:

代码语言:javascript
复制
Dim word As New Word.Application()
word.Visible = False

Dim documents As Word.Documents = word.Documents
Dim doc As Word.Document = documents.Add(Template:=CObj(templatePath), NewTemplate:=False, DocumentType:=Word.WdNewDocumentType.wdNewBlankDocument, Visible:=False)

'' dispose objects
doc.Close()
While (Marshal.ReleaseComObject(doc) <> 0)
End While
doc = Nothing

While (Marshal.ReleaseComObject(documents) <> 0)
End While
documents = Nothing

word.Quit()
While (Marshal.ReleaseComObject(word) <> 0)
End While
word = Nothing

GC.Collect()

正如您所看到的,我正在正确地创建和处理对象,甚至采取额外的步骤来循环Marsha.ReleaseComObject,直到它返回正确的代码。在其他方面,使用objects这个词是很好的,只是那个讨厌的Documents.Add让我感到悲哀。有没有在这个过程中创建的另一个我需要引用和处理的对象?我还需要遵循另一个处理步骤吗?还有别的吗?非常感谢您的帮助:)

Update:我在处理步骤的最后尝试了GC.Collect,但仍然没有成功。

Update 2:我已经将问题缩小到使用自定义模板。当我调用Documents.Add(...)我为新文档指定了一个自定义模板。如果我不这样做,而是不带参数地调用Add(),那么问题就不会发生。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-03-27 02:08:29

我发现在使用自定义模板时使用Documents.Add()是罪魁祸首。我不能解释为什么这会让WinWord.exe挂起来。但是,还有其他方法可以从模板创建文档,这些方法不会导致同样的问题。

所以我换了:

代码语言:javascript
复制
Dim doc As Word.Document = documents.Add(Template:=CObj(templatePath))

通过以下方式:

代码语言:javascript
复制
Dim doc As Word.Document = documents.Add()  
doc.AttachedTemplate = templatePath  
doc.UpdateStyles()

使用AttachedTemplate来指定模板对我来说是有效的,并且不会让WinWord.exe挂起。

(然而,出现了一个新的问题...使用AttachedTemplate/UpdateStyles时,不会将模板页脚中的图像复制到文档中。我认为这是一个单独的问题。但是因为这个方法解决了我最初的问题,所以我很满意。感谢提供答案的每一个人!)

票数 2
EN

Stack Overflow用户

发布于 2010-03-26 00:15:35

你试过改变吗?

代码语言:javascript
复制
oWord.Visible = False

代码语言:javascript
复制
oWord.Visible = True

我这样问是因为Word可能会要求您执行与您正在尝试使用的模板相关的操作。如果它认为有一个对话框显示,它通常不会关闭。IIRC,有一种方法可以让它强制退出,而不会等待任何对话框。但是,已经有一段时间了。

票数 4
EN

Stack Overflow用户

发布于 2010-04-06 01:38:06

当我这样做的时候,我遇到了同样的问题:

代码语言:javascript
复制
object missing = System.Reflection.Missing.Value;
wordApplication.Quit(ref missing, ref missing, ref missing);

我是这样解决的:

代码语言:javascript
复制
object objFalse = false;
wordApplication.Quit(ref objFalse, ref objFalse, ref objFalse);

不要问我为什么,自动化办公是一种冒险:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2511464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档