Frederik Carlier wrote:
> Hi all,
> 
> I have, unfortunately, another Interop problem with Mono. Using a struct
> like this:
> 
>     [StructLayout(LayoutKind.Sequential)]
>     internal struct StreamSource
>     {
>         private TidyBuffer buffer;
>         private Stream stream;
>     }
> , I have the following code:
> 
>             StreamSource data = new StreamSource();
>             data.stream = stream;
>             IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(data));
>             Marshal.StructureToPtr(data, ptr, true);
> 
> which runs fine on Windows and Microsoft .NET, but crashes badly on Mono:
> 
> ** ERROR **: Type System.MarshalByRefObject which is passed to unmanaged
> code must have a StructLayout attribute
> aborting...
> Stacktrace:
> 
>   at (wrapper managed-to-native)
> System.Runtime.InteropServices.Marshal.StructureToPtr
> (object,intptr,bool) <0x00004>
>   at (wrapper managed-to-native)
> System.Runtime.InteropServices.Marshal.StructureToPtr
> (object,intptr,bool) <0xffffffff>
>   at (...)
> 
> So, obviously, the question is: what am I doing wrong, if anything?

Your struct is containing a Stream object which can't be
safely passed to unmanaged code. MS.NET 2.0 doesn't seem to
care in this case (1.1 does), but the code will definitely break
if you're relying on the stream being marshaled back correctly
(MS.NET has a moving/compacting GC).

Please file a bug for the ** ERROR ** on the 2.0 profile
with a compilable test case, but also consider changing the
struct because it's definitely not suitable for p/invoke.

Robert

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

Reply via email to