2017-08-31 75 views
0

有没有一种释放内存并防止MS-Word中下列代码崩溃的方法? 我收到以下错误信息:如何防止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循环以模拟多次按下按钮。

回答

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. 
} 
+0

将检查VSTO的Contrib。看起来很有趣。 –