2011-10-25 22 views
0

一部のテーブルからデータを取得し、単語テンプレートを作成し、そのテンプレートを他のいくつかのファイルと連結する(従来のVB.Net)アプリケーションがあります。Microsoft.Office.Interop.Word.Applicationを作成するときに遅延が発生する

いくつかのマシンでは問題なく動作しますが、1つのクライアントでテンプレートファイルを開くときにWord InteropコードがObject reference not set to an instance of an objectになるという永続的な問題があります(存在し、権限の問題などはありません)。開始-N-停止実行をモーダルダイアログの束をスロー(恐ろしく実装された)デバッグモードで動作

Dim doc As Document 
Dim msWord As Microsoft.Office.Interop.Word.Application 

msWord = New Microsoft.Office.Interop.Word.Application 
' next line throws "Object reference not set to an instance of an object" 
doc = msWord.Documents.Add(verifiedTemplateName) 

場合、例外がスローされていません。

Dim doc As Document 
Dim msWord As Microsoft.Office.Interop.Word.Application 

msWord = New Microsoft.Office.Interop.Word.Application 
MsgBox("VooDoo coder at work") 
' now no exception is thrown 
doc = msWord.Documents.Add(verifiedTemplateName) 

標準モードで動作しているときに、数秒の遅延が発生した場合、例外はスローされません。

Dim doc As Document 
Dim msWord As Microsoft.Office.Interop.Word.Application 

msWord = New Microsoft.Office.Interop.Word.Application 
Delay(5) ' function that pauses for one second 
' now no exception is thrown 
doc = msWord.Documents.Add(verifiedTemplateName) 

これは、いくつかのマシンで、Word.Applicationをするためにいくつかの時間がかかる、ことを示唆している「スピンアップ。」

しかし、これをトラップするにはどうすればよいのでしょうか。タイムフレームがわいせつなものであればエラーを投げる(いつものように、地元の管轄区域で最もよく決められる)?

また、これは私が見てきただけで示唆したソリューションWordApplication.Documents.Add Method return null?

@ MSDNフォーラムで他のユーザーによって報告された問題では、潜在的な無限ループです:

Document nulldoc = null; 
do 
{ 
    document = application.Documents.Add(template, newtemplate, documenttype, visible); 
    Thread.Sleep(100); 
} 
while (document == nulldoc); 

は、より良い解決策はありますこれは愚かな遅れ、またはおそらく無限のチェックループよりも?

関連項目Error when creating an instance of Word in VB.net.同じエラー、同様のコード。解決策はターゲットファイルが存在することを保証することでした(私の場合はそうです)。

答えて

1

私は(System.Windows.Forms.IMessageFilterと同じされていない)the COM IMessageFilter interfaceを実装することで、忙しいアウトプロセスCOMサーバー(私の場合のVisual Studio)との通信の問題を解決覚えています。

テクニックの例はthis MSDN articleです。

Wordが起動中のときに問題が発生するため、になる可能性があります。

あなたが行っているようにOfficeを自動化するときは、Officeが終了できないという問題が発生する可能性があります。as described in this KB article

これを解決するには、インスタンス化するすべてのCOMオブジェクトに対して、好ましくはtry/finally構造でMarshal.ReleaseComObjectを呼び出すように注意する必要があります。参照を見落とさないようにするには、 "double dot"コンストラクトmsWord.Documents.Addを避けて、代わりに明示的にmsWord.Documentsへの参照を作成してください。

あなたのコードはもっと似ているはずです(私はVBを推測しています)。NETの構文が、あなたはアイデアを得るでしょう):

Dim msWord As Application 
Dim doc As Document 
Dim docs As Documents 

Try 
    msWord = ... 
    docs = msWord.Documents 
    ' Test if docs is Nothing to avoid a NullReferenceException 
    If Not docs Is Nothing Then 
     doc = docs.Add... 
     ... 
    End If 
    ... 
Finally 
    If Not doc Is Nothing Then Marshal.ReleaseComObject doc 
    If Not docs Is Nothing Then Marshal.ReleaseComObject docs 
    If Not msWord Is Nothing Then 
     msWord.Quit 
     Marshal.ReleaseComObject msWord 
    End If 
End Try 
+0

ありがとう。私は実際にMarshal.FinalReleaseComObject()を詳細な@ https://blogs.msdn.com/b/yvesdolc/archive/2004/04/17/115379.aspxとして使用しています –

関連する問題