1

このオブジェクトを「解放」するための代替手段は何ですか?通常、.Exit()メソッドが呼び出されたときに発生しますが、この場合、アプリケーションインスタンスという単語を閉じる必要があるユーザーのため、これを行うことはできません。私は何をするか、何を最善の解決策とwordApp = null呼ぶか、そしてその理由を考えましたか?GC.Collect();前もって感謝します。

私は現在これを使用しています:

   public static void Free()
    {
        if (wordApp != null)
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);
            GC.Collect();
        }
    }
4

3 に答える 3

3

Interopオブジェクトが適切に解放されるようにするための最も積極的な方法は、COMオブジェクトの解放Collectから採用されたdouble –<code>WaitForPendingFinalizersパターンを使用することです。

Marshal.ReleaseComObject(wordApp);
wordApp = null;
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

管理対象の世界と管理対象外の世界の間で特に注意が必要な相互運用の1つの領域は、COMオブジェクトを使い終わったときにそれらをクリーンに解放することです。前述の例では、標準のガベージコレクションを使用して必要なすべての動作を実現できました。わずかな機能強化は、GC.Collect2回呼び出すことで、収集に使用できたが最初のスイープで生き残ったメモリが2番目のスイープで確実に収集されるようにすることでした。

于 2012-06-09T19:18:42.067 に答える
3

それを行うためのそれほど積極的でない方法はこのようなものです

        // Make sure to exit app first
        object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
        object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat;
        object routeDocument = false;

        ((_Application)wordApp).Quit(ref saveOption, ref originalFormat, ref routeDocument);

        if (wordApp!= null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(wordApp);

        // Set to null
        wordApp= null;

ただし、すべてのドキュメントが閉じられているか、閉じられて保存されていることを確認してください。

于 2015-03-05T10:45:13.273 に答える
-1

MSDNから

ReleaseComObjectによって返される値がゼロより大きい場合のこれらの状況に対処するために、戻り値がゼロになるまでReleaseComObjectを実行するループでメソッドを呼び出すことができます。

Dim wrd As New Microsoft.Office.Interop.Word.Application
Dim intRefCount As Integer
Do 
  intRefCount = System.Runtime.InteropServices.Marshal.ReleaseComObject(wrd)
Loop While intRefCount > 0
wrd = Nothing
于 2017-01-14T05:11:58.307 に答える