C# 如何防止MS Word内存错误

C# 如何防止MS Word内存错误,c#,vba,memory-management,ms-word,vsto,C#,Vba,Memory Management,Ms Word,Vsto,有没有办法释放内存并防止以下代码在MS Word中崩溃? 我收到以下错误消息: 由于内存或磁盘问题,此方法或属性不可用 --或-- public void CsharpRibbon\u单击(O.IRibbonControl c) { var doc=app.ActiveDocument; var style=doc.style[Wd.WdBuiltinStyle.wdStyleNormal]; 对于(int i=0;i

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

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

--或--

public void CsharpRibbon\u单击(O.IRibbonControl c)
{
var doc=app.ActiveDocument;
var style=doc.style[Wd.WdBuiltinStyle.wdStyleNormal];
对于(int i=0;i<100;i++)
{
var readingOrder=style.ParagraphFormat.readingOrder;
foreach(文档样式中的Wd.Style s)
s、 Font.SizeBi=s.Font.Size+3;
}
}

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

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

Paragraph para = Paragraphs[1];
// etc.
Marshal.ReleaseComObject(yourObject);
还有一个让这更容易的方法。与调用
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.
}
foreach(段落.ComLinq()中的段落段落)
{
int pageBreakBefore=第pageBreakBefore段;
//等等。
}

将签出VSTO Contrib。看起来很有趣。
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.
}