[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


situation:
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 
GetString.
Unhandled Exception: System.NullReferenceException: A null value was 
found where an object instance was required
in <0x001a5> 00 System.Text.UTF8Encoding:InternalGetCharCount 
(byte[],int,int,uint,uint,bool,bool)
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 
that?

thanks

Mohammad DAMT <mdamt at bisnisweb.com>



More information about the Mono-devel-list mailing list