3
  1. アプリを起動してWordファイルを開くと、タスクマネージャーに3つのプロセスwinword.exeが表示されます。
    'close'関数1を呼び出した後、プロセスwinword.exeが閉じられました。

  2. デストラクタでworddoc.close()またはwordapp.quit()を呼び出すと、「基になるRCWから分離されたCOMオブジェクトを使用できません」という例外が発生しました。

public class WordHelper
{
    private object nullobj = System.Reflection.Missing.Value;

    public string context = "";

    Microsoft.Office.Interop.Word.Document doc = new Document();
    Microsoft.Office.Interop.Word.Application wordApp = new Application();

    public WordHelper(string FileName)
    {
           //Open word file
    }

    //somefunction fo work with file

    public void CloseWord()
    {
        doc.Close();
        wordApp.Quit();
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wordApp);
    }

    ~WordHelper()
    {
        //i got exception
        doc.Close();
        wordApp.Quit();
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wordApp);
    }
}

クラスの呼び方

        WordHelper wddoc = new WordHelper("C:\\Test Word\\Test.docx");
        wddoc.CloseWord(); //this line i use and can close 1 process not 3
        //One process close after i close application

最後に、アプリケーションによって開かれたすべてのwinword.exeを閉じ、デストラクタで閉じたいと思います。最後に、アプリケーションによって開かれたすべての「winword.exe」を閉じる必要があり、デストラクタでそれらを閉じる必要があります。

4

2 に答える 2

4

これは、ファイナライザー(デストラクタとは異なります)で実行しています。ファイナライザーは非決定論的です。つまり、クラスメンバーを実行するまでに、クラスメンバーはすでにファイナライズされている可能性があり、したがって無効になります。

Disposeパターンを実装し、ワードCOMオブジェクトの存続期間を明示的に制御します。この回答には、役立つリンクがたくさんあります。

于 2012-04-25T13:25:38.123 に答える
-2

// WINWORD.exeプロセスを見つけて、RealTimePriorityをWINWORD.exeに設定します//これは迅速な処理に使用されます

Process[] proces = Process.GetProcessesByName("WINWORD");


foreach (Process proc in proces)

{

   proc.PriorityClass = ProcessPriorityClass.RealTime;
}
于 2013-08-20T06:30:48.607 に答える