.net 利用word模板生成word文件后,winword进程关不掉

eb5mj 2010-09-08 04:41:03
如题,我做了一个web页面,里面调用了word模板生成word文件,但是word文件生成后,查看进程winword.exe怎么也关闭不掉。
我已经在程序里面写了
finally
{
if (_DocumentClass != null)
{
try
{
_DocumentClass.Close(ref _NullObject, ref _NullObject, ref _NullObject);
System.Runtime.InteropServices.Marshal.ReleaseComObject(_DocumentClass);
}
catch (Exception ex)
{
lblErr.Text += ex.Message;
}
}

if (_Application != null)
{
try
{
_Application.Quit(ref _NullObject, ref _NullObject, ref _NullObject);
System.Runtime.InteropServices.Marshal.ReleaseComObject(_Application);
}
catch (Exception ex)
{
lblErr.Text += ex.Message;
}
}

_Application = null;
_DocumentClass = null;

GC.Collect();
}
但还是不行,每次生成word文件都产生一个新的winword进程,很郁闷。
请教大家,怎么才能让他每次生成word文件后自动关闭winword进程。

除了再单独写段代码kill掉,有没有其他比较好的解决办法啊?
...全文
727 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hackjisu 2011-03-06
  • 打赏
  • 举报
回复
我是这么做的 可以结束掉Word的进程
这是建立连接
Dim W1 As New Word.Application
Dim D1 As New Word.Document


用完之后这么做
D1.Close()
W1.Quit()

W1 = Nothing
D1 = Nothing

这样之后就关掉了 可以试一下 呵呵
一开始我没加那个 W1.Quit()
跟你一样也关不掉
eb5mj 2010-09-10
  • 打赏
  • 举报
回复
是啊,是要让用户下载。

我用了你的方法,用在Web中了。效果还可以。

这些天又查查了资料还是没有找到更加理想的解决办法,算了,结贴了。

谢谢。
eb5mj 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sunguoshun 的回复:]
我用过Excel,也是这样。我的解决办法是Kill进程。

代码:
DateTime startTime = System.DateTime.Now;//记录Word进程打开的时间
...
//操作完成杀死Work进程
...
foreach(System.Diagnostics.Process process in processes)
{
if(startTime < process.StartTime)
process.Kill();
}[/Quote]

兄弟,我又想了一下你的代码,你判断的是:startTime < process.StartTime,这样如果有多用户同时操作的话,会不会把别人的进程也kill掉啊?

或许用startTime >= process.StartTime 更好一点?
eb5mj 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
……
if(!thisproc.CloseMainWindow()){
thisproc.Kill();
}}
[/Quote]

你这个是用于杀winform应用程序的方法吧,我的是web的。不过还是要感谢你,让我又学了新东西。
eb5mj 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sunguoshun 的回复:]
引用 9 楼 eb5mj 的回复:
额,谢谢楼上的兄弟。

还是期待能有office组件调用本身的完美解决办法。。。。。


呵呵,我也期待,有了告诉我一声,我现在也只能用这个方法。
[/Quote]

好的,一定!
sunguoshun 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 eb5mj 的回复:]
额,谢谢楼上的兄弟。

还是期待能有office组件调用本身的完美解决办法。。。。。
[/Quote]

呵呵,我也期待,有了告诉我一声,我现在也只能用这个方法。
eb5mj 2010-09-09
  • 打赏
  • 举报
回复
额,谢谢楼上的兄弟。

还是期待能有office组件调用本身的完美解决办法。。。。。
sunguoshun 2010-09-09
  • 打赏
  • 举报
回复
我用过Excel,也是这样。我的解决办法是Kill进程。

代码:
DateTime startTime = System.DateTime.Now;//记录Word进程打开的时间
...
//操作完成杀死Work进程
System.Diagnostics.Process[] processes;
processes = System.Diagnostics.Process.GetProcessesByName("WINWORD");
foreach(System.Diagnostics.Process process in processes)
{
if(startTime < process.StartTime)
process.Kill();
}
eb5mj 2010-09-09
  • 打赏
  • 举报
回复
试了,都一样的。。。
  • 打赏
  • 举报
回复
换台机器试试
eb5mj 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wang355 的回复:]
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp)
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
S……
[/Quote]

你这个是操作Excel的吧,我要的是word的,谢谢。
wang355 2010-09-09
  • 打赏
  • 举报
回复
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp)
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
sunguoshun 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 eb5mj 的回复:]
引用 8 楼 sunguoshun 的回复:
我用过Excel,也是这样。我的解决办法是Kill进程。

代码:
DateTime startTime = System.DateTime.Now;//记录Word进程打开的时间
...
//操作完成杀死Work进程
...
foreach(System.Diagnostics.Process process in processes……
[/Quote]

这个方法我只在WinForm中用,如果你在Web中使用就不合适了。
你生成的Word是不是要让用户下载阿。
eb5mj 2010-09-08
  • 打赏
  • 举报
回复
楼上的兄弟,你的方法是显示放资源,如果没有释放掉,则将进程kill掉。
这个我知道可以解决。
但我想知道问题的根本所在,按说释放资源后应该可以自动关闭掉的。

另外,我在debug环境下反复调试是可以自动关闭的,但是一发布到正式网站上就不行了。
wuyq11 2010-09-08
  • 打赏
  • 举报
回复
如同excel
xlApp.Workbooks.Close();
xlApp.Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp)
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
xlApp = null;
wb = null;
ws = null;
System.Diagnostics.Process myproc= new System.Diagnostics.Process();
foreach (Process thisproc in Process.GetProcessesByName(processName)) {
if(!thisproc.CloseMainWindow()){
thisproc.Kill();
}}

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧