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

Reply via email to