2017-08-31 74 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。看起來很有趣。 –