[Mono-devel-list] reading char * from extern function

md at mt.web.id md at mt.web.id
Thu May 22 03:31:58 EDT 2003

I have a C library. One of it's function is:

char * some_func(int param, const char * param2) {
    char *retval = NULL;
    /* retval is modified */
    retval = malloc (1024);
    strcpy (retval, "abc");
    return retval;

in C# I implement this
[DllImport ("libname", EntryPoint="some_func")]
static extern byte [] libname_some_func (int uid, byte [] program);

public static void cs_side ()
      string s = Encoding.UTF8.GetString (libname_some_func (0,"test"));
      Console.WriteLine ("{0}", s);

when I run the program, libname_some_func() always returns null to 
Unhandled Exception: System.NullReferenceException: A null value was 
found where an object instance was required
in <0x001a5> 00 System.Text.UTF8Encoding:InternalGetCharCount 
in <0x0002a> 00 System.Text.UTF8Encoding:GetCharCount (byte[],int,int)
in <0x00063> 00 System.Text.Encoding:GetChars (byte[])
in <0x00014> 00 System.Text.Encoding:GetString (byte[])
in <0x000d9> 00 T.Test:cs_side ()
in <0x00019> 00 T.Test:Main ()

if I change byte [] to char [] like this:
[DllImport ("libname", EntryPoint="some_func")]
static extern char [] libname_some_func (int uid, byte [] program);

public static void cs_side ()
      StringBuilder sb = new StringBuilder ();
      sb.Append(libname_some_func (0,"test"));
      Console.WriteLine ("{0}", sb.ToString());
it yields:
<<<GC Warning: Out of Memory!  Returning NIL!
Trace/breakpoint trap

the value of retval in some_func() exists as I can prove it by doing 
fprintf(stderr,">>>%s<<<", retval) just before it returns;

so the question is simple: how do I get a char * from c functions in C#?
the next question is: should I free() the retval? if yes, how to do 


Mohammad DAMT <mdamt at bisnisweb.com>

More information about the Mono-devel-list mailing list