-
Notifications
You must be signed in to change notification settings - Fork 89
Open
Description
It happens not often, but sometimes my app crashes on calling fz_run_page with System.AccessViolationException.
I cannot re-produce it, it happens occasionally on my client installations.
I guess the crashes are caused by the pinned but immediately un-pinned memory:
public PdfFileStream(IPdfSource source)
{
if (source is FileSource)
{
var fs = (FileSource)source;
Context = NativeMethods.NewContext(IntPtr.Zero, IntPtr.Zero, FZ_STORE_DEFAULT); // Creates the context
Stream = NativeMethods.OpenFile(Context, fs.Filename); // opens file as a stream
Document = NativeMethods.OpenDocumentStream(Context, ".pdf", Stream); // opens the document
}
else if (source is MemorySource)
{
var ms = (MemorySource)source;
Context = NativeMethods.NewContext(IntPtr.Zero, IntPtr.Zero, FZ_STORE_DEFAULT); // Creates the context
GCHandle pinnedArray = GCHandle.Alloc(ms.Bytes, GCHandleType.Pinned);
IntPtr pointer = pinnedArray.AddrOfPinnedObject();
Stream = NativeMethods.OpenStream(Context, pointer, ms.Bytes.Length); // opens file as a stream
Document = NativeMethods.OpenDocumentStream(Context, ".pdf", Stream); // opens the document
pinnedArray.Free();
}
}
I think pinnedArray must be an instance variable, and pinnedArray.Free() called in Dispose(), so the memory cannot get moved around by the garbage collector.
Metadata
Metadata
Assignees
Labels
No labels