2

私は c# .NET を使用して、MSOFFICE com 相互運用 DLL を使用して MS com を呼び出しています。

Office com 相互運用がスレッド セーフではないことはわかっています。ただし、別のユーザーにとってはスレッドセーフでしょうか? Windows でのプロセスの分離については、これが一般的なこのような共有コンポーネントによる制限なのか、それとも Office com の記述が不十分なだけなのかを知るには十分ではありません。たとえば、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 がサーバー環境でサポートされていない理由は、Office が "スレッドセーフ" ではないためだとよく誤解されています。そうではありません。とりわけ、COM のプロセス間通信の性質によって、(ほとんどの合理的な使用パターンの下で) ほとんどの処理が行われます。また、Microsoft は、Office がマルチユーザー環境で完全にサポートされるようにしています。なぜなら、(適切なライセンス金額で) 多数の同時ユーザーをサポートするターミナル サーバーで Office を有効にするあらゆる理由があるからです。

その理由は、Office がインタラクティブな環境で使用されるように指定され、作成され、テストされたためです。Office アプリケーションは、制御できない状況下でメッセージ ボックスまたはダイアログ ボックスを表示します。設計上、キーボードを手元に置いて画面を見つめている人間がいて、プロンプトや通知に応答する準備ができていることを完全に想定しています。

アプリケーションが何をどのように行うかはわかりません。テストとアプリケーションが本質的にインタラクティブである限り (ユーザーが Office と対話できることを意味します)、他のサーバーと共有されているサーバー上で実行しても問題ありません。アプリケーションが本質的にインタラクティブでない場合、専用マシン上の 1 人のユーザーでさえ、遅かれ早かれ予期しない動作やクラッシュを経験する可能性があります。

于 2013-06-15T21:41:34.107 に答える