为VB6构建的COMHOST库使用iText7时触发对象引用错误
在VB6 COMHOST环境中使用iText 8.0.1触发“对象引用未设置为实例”错误
问题背景
我正在为遗留VB6应用开发COMHOST库,编译正常,其他功能(包括引入的其他新NuGet包)均可正常运行,但使用iText 8.0.1时遇到异常。相同的iText代码在原生.NET6应用中运行完全正常,排除语法问题;但在VB6托管的COMHOST环境中执行时,会返回空对象并触发Object reference not set to an instance of an object错误。之前项目使用iText 5.5.13,现在升级到8.0.1并重构了代码,希望修复问题而非回退到已废弃的旧版本。
排查过程
初始定位:附加到VB6进程调试.NET代码,最初发现以下代码执行后
pdfDoc被设为null,导致后续报错:var pdfDoc = new PdfDocument(new PdfReader(pdfTemplate), new PdfWriter(newFileName)); var form = PdfFormCreator.GetAcroForm(pdfDoc, true);确认
pdfTemplate和newFileName值均正确。细化调试:调整COMHOST调试设置(关闭优化),拆分代码步骤后,发现实际错误出现在字段赋值行:
var reader = new PdfReader(pdfTemplate); var writer = new PdfWriter(newFileName); var pdfDoc = new PdfDocument(reader, writer); var form = PdfFormCreator.GetAcroForm(pdfDoc, true); form.GetField("shipperAccount").SetValue(shipperAccount); // 错误触发位置调试即时窗口中,
form.GetField("shipperAccount")能正常获取字段实例,shipperAccount变量值也正确,但调用.SetValue()时触发对象引用错误——该问题仅在COMHOST环境中出现,原生C#/.NET6环境无异常。参数测试:发现调用带布尔参数的重载方法可正常运行:
form.GetField("shipperAccount").SetValue(shipperAccount, false);而传入
true时(该参数控制是否生成字段外观),会在iText内部代码触发对象引用错误;同时调用表单扁平化方法也会触发相同错误。
当前进展
- 已联系iText技术支持,对方引导至StackOverflow求助;随后向iText开发者反馈问题,对方已确认但暂未给出回复。
- 为推进项目进度,尝试改用IronPDF库,该库可满足需求且易于快速实现。
内容的提问来源于stack exchange,提问作者klkitchens
相关产品推荐
相关产品推荐

