[Mono-list] marshal a struct

Geoff Norton gnorton at novell.com
Thu Oct 2 16:25:30 EDT 2008


Norbert,

  I suggest you file a bug on http://bugzilla.novell.com/ and attach a
testcase which shows the problem.

-g

On Thu, 2008-10-02 at 21:54 +0200, Norbert Lazzeri wrote:
> hi,
> 
> im playing around a bit with c# and dllimports.
> 
> im working on debian sid with mono and monodevelop from the debian repos
> the shared-library is written in C++ using code::blocks compiled with g++
> 
> specifically im trying to pass a pointer of my struct to the unmanaged 
> function and write some stuff into it. i used this article as help:
> http://www.vsj.co.uk/articles/display.asp?id=501 
> <http://dontknow.me/at/?http://www.vsj.co.uk/articles/display.asp%3Fid=501>
> 
> my unmanaged function:
> /****************************************/
> struct blub {
>     int size;
>     char data[100];
>     bool flag;
> };
> ...
> extern "C" {
> int getStruct(int structSize, blub * str) {
> 
>             if (structSize != sizeof(blub))
>                 return -1;
>            
> 
>             str->size = 234;
>             strcpy(str->data, "das ist ein text");
>             str->flag = false;
> 
>             return 0;
>     }
> };
> /****************************************/
> c# - calling code
> /****************************************/
> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
> public struct INFO
> {
>     public int size;
>     [MarshalAs(UnmanagedType.ByValArray,SizeConst=100)]
>     public char [] data;
>     public bool flag;
> }
>    
> class MainClass
> {
>        
>     [DllImport ("libmitcode", CharSet = CharSet.Ansi)]
>     private static extern int getStruct(int size, ref INFO str);
>    
>     public static void Main(string[] args)
>     {
>         INFO str = new INFO();
>         int res = getStruct(Marshal.SizeOf(str), ref str);
>        
>         Console.Out.WriteLine(str.size);
>         Console.Out.WriteLine(str.flag);
>         Console.Out.WriteLine("<< " + new String(str.data) + " >>");
>         Console.Out.WriteLine(+ res);
>        
>     }   
> }
> /****************************************/
> now this really seems to work, the only problem is the output of 
> monodevelop.
> 
> executing the program within monodevelop gives me:
> 
> "234
> False
> << das ist ein text"
> 
> so the everything thats written to stdout after my string, is truncated.
> 
> if i execute the program from CLI via "mono myprogram.exe" everything 
> works fine and i got:
> 
> "234
> False
> << das ist ein text >>
> 0"
> 
> i dont know whats causing the difference between the outputs, I also 
> tried to Console.out.Flush().
> i dont think thats a monodevelop-issue. so something must be wrong with 
> my code but i have no idea what..
> 
> cheers,
> Norbert
> _______________________________________________
> Mono-list maillist  -  Mono-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list



More information about the Mono-list mailing list