2017-11-13 20 views
-2

私は、Microsoft Wordを読み込んでいくつかの基本的な編集(検索&を見つける)といくつかの自動保存を実行するwinformプログラムを持っています。Microsoft Word Interopのパフォーマンスの問題

既存の単語テンプレートを読み込みます。これも基本テキストです。

interopのコードは次のとおりです。文書一度

try 
     { 
      // Is Word running? 
      WordApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application") as Microsoft.Office.Interop.Word.Application; 
      WordApp.Visible = true; 
      return WordApp; 
     } 
catch (COMException ce) 
     { 
      WordApp = null; 
      if (ce.ErrorCode == unchecked((int)0x800401E3)) 

       WordApp = new Microsoft.Office.Interop.Word.Application(); 

      WordApp.Visible = true; 
      return WordApp; 
     } 

は、彼らが必要なものを、ユーザがタイプオープンしているが、ページの後またはテキストのようにパフォーマンスが本当に遅くなりますことが指摘されています。ユーザーの入力に時間がかかります。

私は初期にはfind/replaceコードに関するいくつかの問題に起因すると考えていたので、テンプレートをロードするコードとは別にすべてをコメントアウトしました。

  WordApp = WordEdit.GetWord(); //Class & Method calling interop code 
     WordApp.Documents.Add(AppDomain.CurrentDomain.BaseDirectory + "\\Templates\\" + DocType + ".dot"); 

     //set Active Document 
     WordDoc = WordApp.ActiveDocument; 

パフォーマンスはまだ低いです。

私はCOMをリリースして物事をnullに設定すると考えましたが、これもまた何の効果もありませんでした。

 System.Runtime.InteropServices.Marshal.ReleaseComObject(WordApp); 
     WordApp = null; 
     WordDoc = null; 

私のアプリでは、一般的にはシステムの速度が遅くなっている可能性があります。アプリケーションを終了しても、ロードしているWordアプリケーションを引き続き使用すると、パフォーマンスはまだまだ低下します。新鮮なWordアプリケーションを(手動で)起動すると、これは完全に機能します。だから私のアプリケーションが単語をロードする方法と関係があります。私のアプリケーションはシステムリソースに影響を与えず、現在はテンプレートをロードする以外の何もしないように設定されています。

Wordを使用する別の方法(interopを使用する別の方法)またはパフォーマンスを向上させる方法はありますか?

答えて

-1

私は遅いパフォーマンスの原因を突き止めることができませんでしたが、私は回避策を見つけました。

marshalを使用して新しいWordセッションを作成する代わりに、このコードを使用します。

これにより、システムがWordセッションを作成するために必要なテンプレート(DocType +拡張子)が開きます。

私は、アクティブ・セッションの制御を取るために

WordApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application") as Microsoft.Office.Interop.Word.Application; 
     WordApp.Visible = true; 
     return WordApp; 

を使用しています。

`System.Threading.Thread.Sleep(2000);もしそうでなければ、物事が速すぎて、私のアプリがWordAppオブジェクト内のアクティブドキュメントを保持できないからです。数秒待つとそれに追いつくチャンスが与えられます。

これは理想的ではありませんが、パフォーマンス上の問題はすべて除外されました。