-
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.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels