

vs1015,win7でワード(.doc)からテキスト抽出するのに以下のソースでおこなっていましたがwin10にしたところメモリーリークが発生するようになってしまいました。どう対処したら良いのかご教示の程よろしくお願いします。

[code]

    Microsoft.Office.Interop.Word.Application word = null;
    Microsoft.Office.Interop.Word.Document docs = null;
    try
    {
        word = new Microsoft.Office.Interop.Word.Application();
        object miss = System.Reflection.Missing.Value;
        object path = @"c:\1\1.doc";
        object readOnly = true;
        docs = word.Documents.Open(
            ref path,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss,
            ref miss);
    
           //テキスト抽出処理
    
    }
    catch
    {
    }
    finally
    {
        object oMis = System.Reflection.Missing.Value;
        object oTru = true;
        object oFal = false;
        if (docs != null)
        {
            docs.Close(ref oFal, ref oMis, ref oMis);
            Marshal.ReleaseComObject(docs);
            docs = null;
        }
    
        object saveOption =  Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
        object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat;
        object routeDocument = false;
                ((_Application)word).Quit(ref saveOption, ref originalFormat, ref routeDocument);
    
        if (word != null)
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(word);
            word = null;
        }
        GC.Collect();
    }
    
[/code]


CC BY-SA 3.0
2016-09-06T17:33:42.620
28728
2016-09-07T21:52:58.137
13422
question
c#
(C#) win10 Microsoft.Office.Interop.Word でメモリーリーク発生


リーク個所が提示されないので当てずっぽうですが、

[code]

    ((_Application)word).Quit(ref saveOption, ref originalFormat, ref routeDocument);
    
[/code]

.NETの中でも、COM Interopにおいて **型キャスト**
はCOMにおける`QueryInterface()`に相当します。`word`オブジェクトの新たなコピーを作成し、作成されたコピーに対して`Quit()`を呼び出すことにもなりかねません。不要なキャストは避けるべきです。

挙げられたコードはVisual Studio 2008以前の書き方ですので、Visual Studio 2010以降の書式で整理すると

[code]

    var word = new Application();
    var docs = word.Documents.Open(@"c:\1\1.doc");
    
    //テキスト抽出処理
    
    docs.Close(false);
    word.Quit(WdSaveOptions.wdDoNotSaveChanges, WdOriginalFormat.wdOriginalDocumentFormat, false);
    
[/code]

で済みますが、これでも同様の問題が発生するのでしょうか？


CC BY-SA 3.0
2016-09-07T21:52:58.137
28749
2016-09-07T21:52:58.137
4236
28728
answer