Thanks for the best practice advice; I'll fix this. Regarding the dlopen failure, this does seem to occur deep in glibc, http://code.woboq.org/userspace/glibc/elf/dl-open.c.html, way in where this is unintelligible to me. /* Check whether _dl_open() has been called from a valid DSO. */ 193 if (__check_caller (args->caller_dl_open, 194 allow_libc|allow_libdl|allow_ldso) != 0) 195 _dl_signal_error (0, "dlopen", NULL, N_("invalid caller"));
J-M -----Original Message----- From: Jonathan Pryor [mailto:[email protected]] Sent: Tuesday, 26 November 2013 11:21 AM To: Perraud, Jean-Michel (CLW, Black Mountain) Cc: mono-list Subject: Re: [Mono-list] Failing dlopen on Linux via DllImport with error message 'dlopen: invalid caller' On Nov 25, 2013, at 5:47 PM, [email protected] 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 - [email protected] http://lists.ximian.com/mailman/listinfo/mono-list
