我有几个pdf文件的二进制文件存储在Byte数组的集合中。
我的目标是使用abcpdf将它们连接成一个.pdf文件,然后将新创建的文件流式传输到ASP.Net网站页面上的Response对象。
一直这样做:
BEGIN LOOP ...
'Create a new Doc
Dim doc As Doc = New Doc
'Read the binary of the current PDF
doc.Read(bytes)
'Append to the master merged PDF doc
_mergedPDFDoc.Append(Doc)
END LOOP
95%的情况下工作正常。然而,不时地创建一个新的Doc对象会抛出一个System.ExecutionEngineException并使CLR崩溃。它似乎与大量的pdf(有时只发生2次)或大型pdf有关。它似乎几乎是完全随机的。
这是[cn}中描述的(不太好)abcpdf中的已知错误Item 6.24。我遇到了a helpful SO post,它建议对abcpdf Doc对象使用Using块。
所以现在我这样做了:
Using doc As New Doc
'Read the binary of the current PDF
doc.Read(bytes)
'Append to the master merged PDF doc
_mergedPDFDoc.Append(doc)
End Using
我还没有看到问题再次发生,并且尽可能地将测试版本打到了最佳状态。
有没有人对此错误有类似的经历?这样做了吗?
答案 0 :(得分:3)
当CLR中存在内部错误时,抛出ExecutionEngineExceptions,因此这是Microsoft要修复的错误。
因此,在using或try-catch块中包装代码不太可行。
webSupergoo网站上提到的与.NET 3.5 SP1相关的问题,以及如何将安全属性应用于程序集。我发现在调试网页时发生了这个错误,并怀疑问题也与ASP.NET动态编译有关。
ABCpdf 7.010及更高版本解决了这个问题。对于一个愚蠢的问题道歉,但你是否尝试过最新版本?
您可以使用通过Windows“开始”菜单>找到的PDFSettings实用程序来检查当前安装的ABCpdf版本。节目> ABCpdf 7.0 .NET
如果无法更新ABCpdf,则可能需要考虑卸载.NET 3.5 SP1。