2011-07-27 9 views
1

私はmergefieldとbookmarkを使用してワードドキュメントを処理しています。アプリケーションはデバッグモードではうまく動作しますが、リリースモードではエラーが発生します。その他の詳細が必要な場合は、私に知らせてください。ソースコードは以下のとおりです。リソースがすでに使用されているためにC#アプリケーションのeerorがスローされた.netを使用している。

> Blockquote 
object nothing = System.Reflection.Missing.Value; 
     object filename = "E:\\Templatenew.doc"; 
     object destination = "E:\\new.doc"; 
     object nottrue = false; 

     object oPrintdate = "printdate"; 
     object oClientname = "clientname"; 
     object oClientsname = "clientsname"; 
     object oAsondate = "asondate"; 
     object oAmount = "amount"; 



     myWordApp.Visible = false; 
     myWordDoc = myWordApp.Documents.Add(ref filename, ref nothing, ref nothing, ref nothing); 

     myWordDoc.Activate(); 

     myWordDoc.Bookmarks.get_Item(ref oPrintdate).Range.Text = System.DateTime.Now.ToShortDateString(); 
     myWordDoc.Bookmarks.get_Item(ref oClientname).Range.Text = objproperty.firstname +"" + objproperty.lastname; 

     myWordDoc.Bookmarks.get_Item(ref oAmount).Range.Text = "10000"; 



     myWordDoc.SaveAs(ref destination, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, 
          ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing); 
     myWordDoc.Close(ref destination, ref filename, ref nothing); 



     Response.ContentType = "application/msword"; 
     myWordApp.Application.Quit(ref nottrue, ref nothing, ref nothing); 

     Response.WriteFile("E:\\new.doc"); 
     Response.End(); 

> Blockquote 
+0

サーバー上でWordを自動化しないでください。これは、これを含む重大な問題をもたらすでしょう。 – SLaks

+0

正確なエラーメッセージとは何ですか、そしてそれはどの行からスローされますか? – Keith

+0

new.docがすでに別のプロセスによって開かれている可能性はありますか? winword.exeプロセスがまだ実行中かどうか確認してください。 – Keith

答えて

0

Wordオブジェクトを正しく処理していません。これにより、自動化されたWordプロセスが終了しないようになります。タスクマネージャを開くと、まだ実行中のwinword.exeプロセスが表示されます。これらのプロセスの少なくとも1つがnew.docファイルをロックしている可能性があります。

Wordオブジェクトを正しく参照して処理する方法については、以下のリンクを参照してください。要約:

  • COMオブジェクトでは2つのドットを使用しないでください。参照するオブジェクトプロパティーには常に別の変数参照を作成してください。たとえば、myWordApp.Documents.Add...の代わりにvar documents = myWordApp.Documents; documents.Add...を使用します。
  • 可能であれば、完了したら参照するすべてのCOMオブジェクトに対してClose/Quitメソッドを呼び出します。 (すでにこれをやっていると思います)
  • 各参照をnullに設定し、適切なガベージコレクションメソッドを呼び出すことによって参照されるすべてのCOMオブジェクトを適切に処分します。

How do I properly clean up Excel interop objects?(これはExcelの自動化について語ったが、まだ言葉にも適用される。)(第二リンクを参照してください)

http://www.xtremevbtalk.com/showthread.php?p=1326018

を使用すると、アプリケーションが残されWINWORD.EXEのプロセスがないことを確認してください実行した後、タスクマネージャでハングします。

(注:Wordの自動化を使用するのは本当に注意が必要です。多くの人がstackoverflowでこれを行うことはないと言います。私の経験では、上記のルールを適用し、Wordプロセスを可能な限り短く開いたままにしておきます。私は1年以上問題なく、適度に人身売買されているサイトでこれを使用しています)。

+0

ありがとうございますキース、私は理解し、問題を解決しました。たくさんの..ありがとう – sachin

+0

それは動作していることを嬉しくない! – Keith

関連する問題