我在项目中使用wkhtmltoxsharp包装库从html生成pdf文件。
我在不同的电脑上经常使用这个库,突然,我遇到了以下问题:
System.AccessViolationException:试图读取或写入受保护的内存。这通常表示其他内存已损坏。
在wkhtmltoxsharp.wkhtmltopdf converter.wkhtmltopdf_convert(intptr converter)
在wkhtmltoxsharp.wkhtmltopdfconverter.convert(字符串inputtml)
在wkhtmltoxsharp.wkhtmltopdfconverter.convert()
在WKHTMLEngPosix.Mul复用转换器Bu8()
---内部异常堆栈跟踪结束---
在sanford.threading.delegatequeue.endinvoke(IAsyncResult结果)
在sanford.threading.delegatequeue.invoke(委托方法,对象[]参数)
在WKHTMLEngPosix.Mululink转换器。
这似乎是这个库的一个常见问题(我在网上找到了一些关于它的反馈-但是没有提供任何修复)。顺便说一句,在我的情况下,这是随机发生的。我在其他开发机器上没有遇到这个问题。我想知道是否有人能解决这个问题。我还想知道这是否是包装库的问题,如果是wkhtmltopfd库本身的问题。
有什么建议吗?我也开放使用另一个转换器,只要它是自由和稳定的,如果可能的话,没有产生一个新的进程。它必须在所有windows版本中正常稳定地工作,并进行适当的转换(要转换的html是固定的-包含一些图片、表格和基本css)。
最佳答案
我建议另一种方法:直接使用wkhtmltopf.exe,构建自己的包装器。如果您控制了输入,并且知道如何更新它以及选项如何工作,那么它们并不十分复杂。直接使用wkhtmltopdf(在win7、win server 2008 r2、ubuntu和centos上)时,我从未遇到过这个问题。但它们确实为每次转换生成进程。
例如,查看关于wkhtmltoppdf的Derp class in another answer of mine。或者尝试下面未经测试的代码(真正的代码会更复杂,这只是一个demo/poc)。
var pi = new ProcessStartInfo(@"c:\wkhtmltopdf\wkhtmltopdf.exe");
pi.CreateNoWindow = true;
pi.UseShellExecute = false;
pi.WorkingDirectory = @"c:\wkhtmltopdf\";
pi.Arguments = "http://www.google.com gogl.pdf";
using (var process = Process.Start(pi))
{
process.WaitForExit(99999);
Debug.WriteLine(process.ExitCode);
}