ASP.net C# - WINWORD.exe

时间:2009-12-01 20:15:03

标签: asp.net ms-office

我正在使用ASP.NET / C#程序中的Microsoft Word文档。

我的程序在内部打开word文档。使用

app = new Word.Application();
app.Documents.Open

它创建了一个winword.exe进程的实例,我可以在任务管理器中看到它。

即使我使用close()app.quit()关闭了文档。它应该杀死这个过程。但这个过程并没有被杀死。

任何想法如何以编程方式杀死此进程。

7 个答案:

答案 0 :(得分:5)

首先,我同意Arthur和Ivo:不要在服务器上使用Word自动化......它不受支持,而且很痛苦。

  1. 如果可以,请尝试通过DOCX格式支持Word输入/输出(使用.NET Framework支持的压缩打包fully documented XML format,并使用插件支持前Office 2007)< / LI>
  2. 如果没有创建一个处理队列中请求的服务,以防止多个线程同时使用它(ala Ivo's answer
  3. 如果必须使用Word自动化:

    1. 确保您设置尽可能多的应用程序选项以防止出现对话框
    2. 确保您将WdSaveOptions.wdDoNotSaveChanges传递给Document.Close
    3. 浏览一下这个文件:How To: Dismiss a Dialog Box Displayed by an Office Application with Visual Basic .NET(显然也适用于C#)
    4. 请务必在上调用Marshal.ReleaseComObject 文档和应用程序对象,并确保它位于finally块中。
    5. 如果你按照上面的说法,winword.exe 应该消失,你不需要杀死这个过程。

      编辑:不是您问题的答案,但仍然是主题。请记住,您还将在具有权限的服务器上遇到问题。确保为其创建特定用户,并将该用户用作AppPool标识(或服务标识)。然后,您需要执行以下操作:

      1. 确保您已安装自动化组件,显然
      2. 运行“dcomcnfg”
      3. 组件服务 - &gt;计算机 - &gt;我的电脑 - &gt; COM +应用程序
      4. “Microsoft Word文档”(或“{000209FF-0000-0000-C000-000000000046}”) - &gt;特性
      5. 安全标签 - &gt;启动和激活权限 - &gt;定制
      6. 点击“编辑”并从上面添加您的AppPool用户
      7. 重复步骤5-6,但选择“访问权限”
      8. 除此之外,您仍然可能需要直接从服务器运行winword.exe一次作为您的AppPool用户,尽管有上面的对话框选项,以便最初设置配置文件。

答案 1 :(得分:2)

Office应用程序不会“销毁”创建的第一个实例。使用excel时会发现同样的问题。

见这个和其他人

50 Ways to Kill Excel

How to kill a process given a name

答案 2 :(得分:2)

查看System.Diagnostics.Process.GetProcessesByName和System.Diagnostics.Process.Kill

尝试类似

的内容
string processName = "ProcessName";
Process[] processes = Process.GetProcessesByName(processName);

foreach(Process process in processes)
{
    process.Kill();
}

答案 3 :(得分:1)

你应该能够抓住每个单词的过程并杀死它:

foreach(Process p in System.Diagnostics.Process.GetProcessesByName("winword"))
 {
   p.kill();
   p.WaitForExit();
 }

您还应该尝试将文档对象视为null吗?

答案 4 :(得分:1)

在服务器上使用(Microsoft)Office的最安全方法是创建一个可以接受流并创建Word(或任何其他Office应用程序)实例的服务,然后杀死应用程序。 如果您不这样做,对运行的办公室应用程序的引用将保留在您的asp工作进程中。这意味着很多进程将继续运行,直到您的asp工作进程被回收。这是一个很大的潜在内存泄漏。

这就是我们这样做的方式。花费大量时间来正确构建,但这是最安全的方式。

答案 5 :(得分:0)

这让我发疯,直到我在这个网站上找到this post。该页面上的第二个解决方案对我有用 - 第一个看起来更简单,但实际上很难跟踪你所引用的所有隐藏的COM对象。第二种方法始终有效 - 您不必跟踪每个对象。

答案 6 :(得分:0)

简单地说:Office应用程序不应该在服务器上运行。它们也不应该用于服务或WebApplication。

是的 - 我们还有一些要求迫使我们在服务器上使用Office产品。而且我们总是遇到麻烦。

如果有机会不使用Office(处理WordML,新的Office XML格式),那么就这样做。