2

我正在使用 c# .NET 使用 MSOFFICE com 互操作 DLL 调用 MS com。

我知道 Office com 互操作不是线程安全的。但是,对于不同的用户来说它是线程安全的吗?我对 Windows 上的进程隔离知之甚少,不知道这是否是像这样的共享组件的限制,或者 Office coms 只是写得不好。例如,调用 PPT 并输出视频实际上是打开 PPT 并将视频渲染为 AVI。我知道他们会使用相同的登录用户帐户发生冲突,但是如果不同的登录系统用户调用该过程可以吗?

我问是因为我想在已经托管另一个应用程序的机器上建立一个测试环境。IT 在理论上很难测试,因为我们不能保证会发生进程冲突,但它可能会发生。

运行良好,可以运行数周和数月。

调用示例:

using Microsoft.Office.Core;
using Microsoft.Office.Interop.PowerPoint;

Application app = new Application();              
Presentations presList = app.Presentations;                
Presentation pres = null;
// ... do some stuff ...

    // then kill it. 
    private static bool KillPowerPoint()
    {
        Process[] prs = Process.GetProcesses();
        var killed = false;
        // do a bunch of stuff to kill the process ...
        return killed;
    }
4

2 回答 2

3

一个常见的误解是,Office 在服务器环境中不受支持的原因是因为它不是“线程安全的”。不是这样。除其他事项外,COM 进程间通信的本质非常关心这一点(嗯,在最合理的使用模式下)。此外,Microsoft 确保在多用户环境中完全支持 Office,因为他们完全有理由在支持数十个同时用户的终端服务器下启用 Office(以获得适量的许可证费用)。

原因是 Office 被指定、编写和测试以在交互式环境中使用。Office 应用程序会在您无法控制的情况下发出消息框或对话框。根据设计,它完全期望有人手持键盘盯着屏幕,随时准备响应任何提示或通知。

我们不知道您的应用程序做什么,或如何。只要您的测试和您的应用程序本质上是交互的(我的意思是用户可以与 Office 交互),在与其他东西共享的服务器上运行应该没问题。如果您的应用程序本质上不是交互式的,那么即使是专用机器上的单个用户也可能迟早会遇到意外行为或崩溃。

于 2013-06-15T21:41:34.107 回答
0

COM Interop for office 是一个 STA(单线程单元)。因此,虽然它不支持单线程多线程,但 COM 会序列化所有传入的命令。

我认为这是旧版办公版本的问题:

当 Office 在此环境中运行时,Office 可能会出现不稳定的行为和/或死锁。

但是,我认为使用 > 2010 office coms 时不存在阻塞或稳定性问题。

“用于编组到 STA 的 Ole RPC 协议涉及打包调用并将消息实际发送到服务器进程中的隐藏窗口(Ole 提供)。当服务器调度该消息时,Ole 窗口的 WndProc 解包消息并执行“ 在此处输入链接描述

于 2013-06-14T20:47:56.510 回答