[Mono-list] Interop problem: ** ERROR **: Type System.MarshalByRefObject which is passed to unmanaged code must have a StructLayout attribute

Frederik Carlier frederik.carlier at carlier-online.be
Mon Feb 26 10:32:19 EST 2007


Thanks. So it is a "bug" (or at least something that could be improved
upon) in the MS framework, then. But indeed, the basic problem is this:
I need to set some callbacks from unmanaged code. The callback should
contain a stream (or a reference to it) as a parameter.

Is there any way this can be achieved (I heard about "pinning", but is
that something that I can use here)? Another solution would be to use a
dictionary in managed memory and use the key as the parameter on the
callback funcion, but then again that seems like some overkill to me.

Any ideas?


Robert Jordan schreef:
> 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  -  Mono-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list

More information about the Mono-list mailing list