【问题标题】:How to prevent MS-Word memory error如何防止 MS-Word 内存错误
【发布时间】:2018-02-09 23:58:51
【问题描述】:

有没有办法释放内存并防止以下代码在 MS-Word 中崩溃? 我收到以下错误消息:

由于内存或磁盘问题,此方法或属性不可用。

Sub vbaTest()
Dim doc As Document
Dim sty As Style
Dim s As Style
Dim readingOrder As WdReadingOrder
Dim i As Integer
    Set doc = ActiveDocument
    Set sty = doc.Styles(wdStyleNormal)
    For i = 0 To 100
        readingOrder = sty.ParagraphFormat.readingOrder
        For Each s In doc.Styles
            s.Font.SizeBi = s.Font.Size + 3
        Next
        Set s = Nothing
    Next
    Set sty = Nothing
End Sub

-- 或--

public void CsharpRibbon_Click(O.IRibbonControl c)
{
    var doc = app.ActiveDocument;
    var style = doc.Styles[Wd.WdBuiltinStyle.wdStyleNormal];
    for (int i = 0; i < 100; i++)
    {
        var readingOrder = style.ParagraphFormat.ReadingOrder;
        foreach (Wd.Style s in doc.Styles)
            s.Font.SizeBi = s.Font.Size + 3;
    }
}

上面的代码实际上并没有什么帮助。我有一个功能区按钮,我注意到它在重复按下按钮时会导致崩溃(在 Word 会话中大约 5 或 6 次)。我剥离了代码并添加了 for 循环来模拟多次按下按钮。

【问题讨论】:

    标签: c# vba memory-management ms-word vsto


    【解决方案1】:

    我不确定这是否是您的错误,因为 100 次迭代似乎不足以导致内存错误,但 VSTO 使用 COM 对象,必须在使用后释放。简单的方法是:

    Paragraph para = Paragraphs[1];
    // etc.
    Marshal.ReleaseComObject(yourObject);
    

    还有VSTO Contrib 让这更容易一些。与其拨打ReleaseComObject,不如执行以下操作:

    using (var doc = Document.WithComCleanup())
    using (var paragraphs = doc.Resource.Paragraphs.WithComCleanup())
    {
        int count = paragraphs.Resource.Count;
        // etc.
    }
    

    或者,对于集合:

    foreach (Paragraph para in Paragraphs.ComLinq<Paragraph>())
    {
        int pageBreakBefore = para.PageBreakBefore;
        // etc.
    }
    

    【讨论】:

    • 将查看 VSTO Contrib。看起来很有趣。
    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 2016-07-08
    • 1970-01-01
    • 2014-01-25
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多