[Mono-list] SizeParamIndex attribute size ?

Lloyd Dupont lloyd@galador.net
Tue, 02 Oct 2001 01:29:18 +0200

Hy fellow user, any one could help ?

i have a few interop code and i want to pass an array from C to C# via a 
i could only pass Length 1 array, is it a bug ?

here i join you my code you could comment...
makefile -------------------------
all: s.dll s.exe

s.dll: s.c
	gcc -shared -o s.dll s.c

s.exe: s.cs
	csc /unsafe s.cs
s.c -------------------------
typedef struct MyStruct {
	int begin;
	int data[20];
	int end;
} MyStruct;

void doSomething(MyStruct * s) {
	int i;
	for(i=0; i<20; i++)
		s->data[i] = i * i;
	s->begin = s->end = -1;

void callIt(void (*fct)(int *, int), int* tab) {
	fct(tab, 5);
s.cs ------------------------
using System;
using System.Runtime.InteropServices;

unsafe class Test
	public struct MyStruct
		public int begin;

		[MarshalAs(UnmanagedType.ByValArray, SizeConst=20)]
		public int[] data;

		public int end;

	public static extern void doSomething(out MyStruct s);
	public static extern void callIt(callback fct, int[] tab);

	public delegate void callback(int[] a, int l);
	static void myCallback(
		[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]
		int[] a,
		int len) {
		Console.WriteLine("callback: len: "+len);
		Console.WriteLine("callback: tab.length: "+a.Length);
		a[2] = -25;

	public static void Main(string[] arg)
		MyStruct s;
		doSomething(out s);
		callIt(new callback(myCallback), s.data);

		Console.WriteLine("begin,end =  "+s.begin+","+s.end);
		for(int i=0; i<20; i++)
			Console.WriteLine("s["+i+"] = "+s.data[i]);