C# 如何防止MS Word内存错误
有没有办法释放内存并防止以下代码在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
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.
}