[Mono-list] DllImport ... help

Jonathan Pryor jonpryor@vt.edu
15 Jun 2002 10:32:53 -0400


An MSDN sample might be worth looking at:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconbufferssample.asp

It works for me on .NET, but I haven't been able to make it work with
mono...  I'm thinking that mono isn't ready for full-blown DllImport
yet.

For example, the following works with .NET

	// native.c
	// Native library
	#include <string.h>

	#ifdef _MSC_VER
	__declspec(dllexport)
	#endif
	int getname(char* s, unsigned int n)
	{
	    const char m[] = "This is my message.  Isn't it nice?";
	    strncpy(s, m, n);
	    return 0;
	}

With VC, compile as `cl /LD native.c'; should create `native.dll'.

On Linux, compile as `gcc -c -fpic native.c && ld -shared -o
libnative.so native.o -lc', should create `libnative.so'

On Linux, make sure that `LD_LIBRARY_PATH' contains the directory with
`libnative.so': `export LD_LIBRARY_PATH=`pwd`'

Now, the managed code:

	// managed.cs
	using System;
	using System.Runtime.InteropServices;
	using System.Text;
	
	public class ghbn {
	  [DllImport("native")]
	  private static extern int getname(
	    StringBuilder sb, 
	    uint len);
	
	  public static void Main () {
	    StringBuilder sb = new StringBuilder(255);
	    getname(sb, (uint) sb.Capacity);
	    Console.Write("name: ");
	    Console.WriteLine(sb.ToString());
	  }
	}

Compile under .NET with `csc.exe /out:managed-net.exe managed.cs'

Compile under mono with `mcs managed.cs'

When I run either `managed.exe' (the mcs-compiled program) or
`managed-net.exe' (the csc-compiled program) under .NET, I get the
expected output:

	name: This is my message.  Isn't it nice?

When I run either `managed.exe' or `managed-net.exe' under mono, I get
errors:

	name: 
	** (process:13403): WARNING **: unhandled exception
	System.NullReferenceException: "A null value was found where an 	object
instance was required"
	in <0x00065> .ghbn:Main ()

	RESULT: -1

This implies to me that Mono does not properly handle PInvoke calls, at
least currently.  (CVS tree built around 9:00 AM this morning).

I should probably add this to bugzilla...

 - Jon

On Fri, 2002-06-14 at 13:40, Stewart Allen wrote:
    I've been struggling with DllImport all evening just to call 
    gethostname(char *buf, int len). Seems like it should be simple. There 
    appear to be a lot of examples of sending string arguments and getting 
    string return values, but I can't find anything that addresses filling a 
    preallocated string buffer.
    
    most tests (that I can get to compile) result in:
    
    ** (process:7): WARNING **: unhandled exception 
    System.NullReferenceException: "A null value was found where an object 
    instance was required"
    
    Any help is greatly appreciated.
    
    
    _______________________________________________
    Mono-list maillist  -  Mono-list@ximian.com
http://lists.ximian.com/mailman/listinfo/mono-list