在使用HTML页眉/页脚的InsertPdf后发生AccessViolationException

Curtis Chau
Curtis Chau
Updated: 2026年6月12日

在另一个文档的页面合并后调用AccessViolationException。 在Debug构建或附加调试器时不会发生此异常。

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at IronPdf.PdfDocument.AddHtmlHeadersAndFooters(...)
Text

在Release构建中,.NET JIT优化器允许垃圾回收器在托管对象不再被托管代码引用时,在它们的词法作用域结束前回收托管对象。 传递给PdfDocument可以在IronPDF的本地Chrome层仍在读取时被回收。 随后的AddHtmlHeadersAndFooters调用会访问已释放的内存,从而产生访问冲突。

解决方案

选项1:在InsertPdf之前应用页眉和页脚(推荐)

重新排序操作,使页眉和页脚在插入任何页面之前写入到基础文档中:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right; font-size:10px'>Page {page} of {total-pages}</div>"
};

var basePdf = renderer.RenderHtmlAsPdf(baseHtml);

basePdf.AddHtmlHeadersAndFooters(renderer.RenderingOptions);

var supplementPdf = PdfDocument.FromFile("supplement.pdf");
basePdf.InsertPdf(supplementPdf, 0);

basePdf.SaveAs("output.pdf");

选项2:使用GC.KeepAlive防止提前回收

如果操作顺序不能更改,则延长PdfDocument的托管生命周期:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right; font-size:10px'>Page {page} of {total-pages}</div>"
};

var basePdf = renderer.RenderHtmlAsPdf(baseHtml);
var supplementPdf = PdfDocument.FromFile("supplement.pdf");

basePdf.InsertPdf(supplementPdf, 0);
basePdf.AddHtmlHeadersAndFooters(renderer.RenderingOptions);

GC.KeepAlive(supplementPdf);

basePdf.SaveAs("output.pdf");

在supplementPdf的回收。

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

阅读更多

准备开始了吗?

Nuget Downloads 21,739,885版本:2026.10刚刚发布