I just wanted to ask because it is a little safer to declare the type that 
you're passing in advance. And you could create multiple P/Invoke 
declarations that refer to the same function like

        [DllImport("libwhatever.so", EntryPoint="Method")]
        static extern void MethodTakesIntArray( int[] );

        [DllImport("libwhatever.so", EntryPoint="Method")]
        static extern void MethodTakesFloatArray( float[] );

Back to your main question, I think that this is a bug in Mono's 
implementation of GC.AddrOfPinnedObject() because my test code, which is 
based on the code you provided, works fine on Rotor. I think that Mono is 
returning a pointer to some data structure that's a few bytes before the 
actual array data. If I change the code to store 1 at @ element 1982 and 2 @ 
1983, Mono gives

==> array(0) = 168
==> array(1) = 208
==> array(2) = 4
==> array(3) = 8
==> array(13) = 48
==> array(1998) = 1
==> array(1999) = 2

If you want, I can file a bug report, or you can do it. I just happened in 
checking this out to write a short test-case.


On Saturday 03 July 2004 4:02 pm, Tim R�disch wrote:
> > Is there some particular reason that you do not know the type in advance?
> > It would be easier if you could do that because you would then be able to
> > write a precise signature for the P/Invoke method.
>
> That's not possible. In detail: this is for an OpenGL-Method, and the array
> can be e.g.
>       height x width x 3 - byte array; e.g. RGB
>       height x width x 1 - float array; e.g. alpha
>       height x width x 4 - float array; e.g. RGBA

_______________________________________________
Mono-list maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to