[Mono-list] marshal a struct

Norbert Lazzeri elnogge at gmx.de
Thu Oct 2 15:54:51 EDT 2008


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


More information about the Mono-list mailing list