[Mono-list] InteropServices: DllNotFoundException...?
Simon Ask Ulsnes
simon@ulsnes.dk
Sun, 23 May 2004 22:49:01 +0200
Thank you, that seems good.
Having always programmed Managed, I'm not really used to C-style memory
management (or memory management at all, actually). ;-)
This will certainly help.
- Simon
Jonathan Pryor wrote:
>On Sun, 2004-05-23 at 11:37, Simon Ask Ulsnes wrote:
>
>
>>*sigh*
>>Hooray for Managed Code! ;-)
>>
>>Could you please give a short example of a C++ library function that
>>returns a string for use in a managed application? (with proper memory
>>hygiene ;-)
>>
>>
>
>Sure. I haven't tried to compile any of this, but it's the right
>idea...
>
> //
> // Unmanaged C++ code
> //
>
> #include <string>
> #include <stdlib.h>
>
> /**
> * To minimize library differences, this function should be used
> * by "external" code (managed code, other 3rd party code) to
> * free memory allocated within this library.
> *
> * This is particularly important on any platform that has
> * multiple runtime libraries which each export "free" (say,
> * Windows, with MSVCRT, GCC, Borland, and lots of other C
> * runtime library implementations, all of which are
> * mutually incompatible).
> */
> extern "C" void
> mylib_free (void* mem)
> {
> free (mem);
> }
>
> /**
> * This is a function which returns a newly allocated string.
> * Callers *must* use mylib_free() to free the returned memory.
> */
> extern "C" char*
> mylib_get_string ()
> {
> std::string s ("this is my string");
> // manipulate `s' to fill its contents
>
> // paranoia: check for integer overflow in buffer size
> // calculation. Consider if s.size() is = 0xFFFFFFFF.
> // 0xFFFFFFFF + 1 = 0, which is too small to hold the
> // required string; any attempt to fill the buffer would
> // result in memory corruption.
> // Yes, this is likely absurd, as your app would likely
> // have crashed by now if it had a string that big, but
> // better safe than sorry.
> // For more information, see:
> // http://msdn.microsoft.com/security/securecode/columns/default.aspx?pull=/library/en-us/dncode/html/secure04102003.asp
> std::string::size_type size = s.size();
> if (size + 1 <= size) return NULL;
> size += 1;
>
> // return newly allocated string.
> char *r = (char*) malloc (size);
> if (!r) return NULL;
> strcpy (r, s.c_str());
> return r;
> }
>
> //
> // Managed code
> //
>
> using System;
> using System.Runtime.InteropServices;
>
> class Mylib {
> [DllImport ("mylib")]
> private static extern void mylib_free (IntPtr r);
>
> [DllImport ("mylib")]
> private static extern IntPtr mylib_get_string ();
>
> public static string GetString ()
> {
> IntPtr r = mylib_get_string ();
> if (r == IntPtr.Zero) return null;
> string s = null;
> try {
> s = Marshal.PtrToStringAnsi (r);
> }
> finally {
> mylib_free (r);
> }
> return s;
> }
> }
>
> - Jon
>
>
>
>
>
>