On Nov 25, 2013, at 5:47 PM, jean-michel.perr...@csiro.au wrote: > [DllImport("libdl")] > [return: MarshalAs(UnmanagedType.LPStr)] > private static extern string dlerror();
You should (almost?) never use `string` (or any other reference type) as the return type in a P/Invoke method: http://mono-project.com/DllImport#Classes_and_Structures_as_Return_Values > The CLI assumes that all memory that is passed between the CLI/unmanaged code > boundary is allocated via a common memory allocator. The developer does not > get a choice in which memory allocator is used. For managed code, the > Marshal.AllocCoTaskMem method can be used to allocate memory, > Marshal.FreeCoTaskMem is used to free the memory allocated by > Marshal.AllocCoTaskMem, andMarshal.ReAllocCoTaskMem is used to resize a > memory region originally allocated by Marshal.AllocCoTaskMem. > > Since classes are passed by reference, a pointer is returned, and the runtime > assumes that it must free this memory to avoid a memory leak. You should instead use IntPtr as the return type, then use Marshal.PtrToStringAnsi() to convert the IntPtr into a string. - Jon _______________________________________________ Mono-list maillist - Mono-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-list