3

Microsoft.MSHTML (バージョン 7.0.3300.0) ライブラリを使用して、HTML 文字列から本文テキストを抽出しようとしています。この機能を単一のヘルパー メソッド GetBody(string) に抽象化しました。

無限ループで呼び出されると、プロセスは最終的にメモリ不足になります (タスク マネージャーで Mem Usage を確認することで確認できます)。問題は、MSHTML オブジェクトの不適切なクリーンアップが原因であると思われます。私は何を間違っていますか?

GetBody(string) の現在の定義は次のとおりです。

public static string GetBody(string html)
{
    mshtml.IHTMLDocument2 htmlDoc = null;
    mshtml.IHTMLElement bodyElement = null;
    string body;

    try
    {
        htmlDoc = new mshtml.HTMLDocumentClass();
        htmlDoc.write(html);
        bodyElement = htmlDoc.body;
        body = bodyElement.innerText;
    }
    catch (Exception ex)
    {
        Trace.TraceError("Failed to use MSHTML to parse HTML body: " + ex.Message);
        body = email.Body;
    }
    finally
    {
        if (bodyElement != null)
            Marshal.ReleaseComObject(bodyElement);
        if (htmlDoc != null)
            Marshal.ReleaseComObject(htmlDoc);
    }

    return body;
}

編集: メモリ リークは、html の値の入力に使用されるコードに追跡されています。この場合、それは Outlook Redemption でした。

4

1 に答える 1

2

mshtmlを使用してから久しぶりですが、IHTMLElement2インターフェースにcloseメソッドがありませんか?あなたはそれを呼んでみましたか?

リークが明らかになる前に、ループはどのくらい実行されましたか?

ここにあるmshtmlを使用するレガシーコードのいくつかを掘り下げて、開発者がどのようにオブジェクトをリリースしたかを確認できます。

編集:

ここにある古いコードは、HTMLDocument2でcloseを呼び出し、comオブジェクトをそのまま解放します。

ただし、ReleaseComObjectメソッドは、ゼロを返すまでループで呼び出されることに注意してください。これにより、すべてのcomラッパーと元のオブジェクトが確実にリリースされます。ここにメモがあります

于 2010-01-07T04:04:58.980 に答える