From a2f8e8e9c74cb953b7c62e4e94c424ba048eb2d3 Mon Sep 17 00:00:00 2001 From: rndusr0 Date: Thu, 7 Feb 2019 20:55:08 +0000 Subject: [PATCH] Fix sporadic 'A callback was made on a garbage collected delegate' bug Update NuGet package details --- src/DinkToPdf/BasicConverter.cs | 1 + src/DinkToPdf/DinkToPdf.csproj | 21 ++++++++++++--------- src/DinkToPdf/PdfTools.cs | 17 +++++++++++++---- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/DinkToPdf/BasicConverter.cs b/src/DinkToPdf/BasicConverter.cs index c9274a3..9b051da 100644 --- a/src/DinkToPdf/BasicConverter.cs +++ b/src/DinkToPdf/BasicConverter.cs @@ -58,6 +58,7 @@ public virtual byte[] Convert(IDocument document) } Tools.DestroyConverter(converter); + ProcessingDocument = null; return result; } diff --git a/src/DinkToPdf/DinkToPdf.csproj b/src/DinkToPdf/DinkToPdf.csproj index 8633e6f..482796b 100644 --- a/src/DinkToPdf/DinkToPdf.csproj +++ b/src/DinkToPdf/DinkToPdf.csproj @@ -2,7 +2,7 @@ 1.0.9 - netcore2.1-wkhtmltopdf-v0.12.5 + 20190207.1+netstandard-2.0-netcore-2.1-wkhtmltopdf-0.12.5 netstandard2.0 $(NoWarn);1591 true @@ -15,18 +15,21 @@ - DinkToPdf_netstandard20 + RndUsr0.DinkToPdf .NET Core P/Invoke wrapper for wkhtmltopdf library that uses Webkit engine to convert HTML pages to PDF. - Upgraded to .NET Standard 2.0, .NET Core 2.1, Windows wkhtmltopdf v0.12.5 + - Upgraded to .NET Standard 2.0, .NET Core 2.1, wkhtmltopdf v0.12.5 + - Fix sporadic 'A callback was made on a garbage collected delegate' bug Copyright 2017 - Rok Dvojmoč, upgraded by Chris Bryden + MIT + Rok Dvojmoč, Chris Bryden https://github.com/rdvojmoc/DinkToPdf + https://github.com/rdvojmoc/DinkToPdf/blob/master/LICENSE https://github.com/rndusr0/DinkToPdf true true - wkhtmltopdf;netstandard;html;pdf;wrapper + wkhtmltopdf;netstandard;netcore;html;pdf;wrapper true @@ -40,19 +43,19 @@ runtimes\win-x64\native Always - + true runtimes\osx-x86\native - + true runtimes\linux-x86\native - + true runtimes\osx-x64\native - + true runtimes\linux-x64\native diff --git a/src/DinkToPdf/PdfTools.cs b/src/DinkToPdf/PdfTools.cs index 7e09034..5c128b3 100644 --- a/src/DinkToPdf/PdfTools.cs +++ b/src/DinkToPdf/PdfTools.cs @@ -12,12 +12,16 @@ public sealed class PdfTools : ITools { public bool IsLoaded { get; private set; } + //used to maintain a reference to delegates to prevent them being garbage collected... + private List _Delegates = new List(); + public PdfTools() { IsLoaded = false; } - - public void Load() { + + public void Load() + { if (IsLoaded) { @@ -55,7 +59,7 @@ public unsafe string GetGlobalSetting(IntPtr settings, string name) //default const char * size is 2048 bytes byte[] buffer = new byte[2048]; - fixed (byte* tempBuffer = buffer ) + fixed (byte* tempBuffer = buffer) { WkHtmlToXBindings.wkhtmltopdf_get_global_setting(settings, name, tempBuffer, buffer.Length); } @@ -118,7 +122,7 @@ public bool DoConversion(IntPtr converter) public void DestroyConverter(IntPtr converter) { - WkHtmlToXBindings.wkhtmltopdf_destroy_converter(converter); + WkHtmlToXBindings.wkhtmltopdf_destroy_converter(converter); } public byte[] GetConversionResult(IntPtr converter) @@ -134,26 +138,31 @@ public byte[] GetConversionResult(IntPtr converter) public int SetPhaseChangedCallback(IntPtr converter, VoidCallback callback) { + _Delegates.Add(callback); return WkHtmlToXBindings.wkhtmltopdf_set_phase_changed_callback(converter, callback); } public int SetProgressChangedCallback(IntPtr converter, VoidCallback callback) { + _Delegates.Add(callback); return WkHtmlToXBindings.wkhtmltopdf_set_progress_changed_callback(converter, callback); } public int SetFinishedCallback(IntPtr converter, IntCallback callback) { + _Delegates.Add(callback); return WkHtmlToXBindings.wkhtmltopdf_set_finished_callback(converter, callback); } public int SetWarningCallback(IntPtr converter, StringCallback callback) { + _Delegates.Add(callback); return WkHtmlToXBindings.wkhtmltopdf_set_warning_callback(converter, callback); } public int SetErrorCallback(IntPtr converter, StringCallback callback) { + _Delegates.Add(callback); return WkHtmlToXBindings.wkhtmltopdf_set_error_callback(converter, callback); }