[Mono-list] Marshal.SizeOf() vs. sizeof operator

Giuseppe Greco gius.greco@bluewin.ch
Wed, 13 Aug 2003 05:59:46 +0200


Marcus,

here's an example:

public enum FieldType : byte
{
    Undefined = 0,
    Int16,
    Int32,
    Int64
}

Then, try something like this:

using System;
using System.Runtime.InteropServices;

public class MyClass
{
    private FieldType fieldType = FieldType.Undefined;

    public void MyMethod()
    {
        Console.WriteLine("The size of fieldType is {0}",
            Marshal.SizeOf(fieldType.GetType());
    }
}

The code above executes sucessfully with Mono on Linux,
but it doesn't with .NET on Windwos, where I always get
the following exception:

Unhandled Exception: System.ArgumentException:
Type FieldType can not be marshaled as an unmanaged
structure; no meaningful size or offset can be computed.
at System.Runtime.InteropServices.Marshal.SizeOf(Type t)

Rewriting MyMethod like this

    public void MyMethod()
    {
        Console.WriteLine("The size of fieldType is {0}",
            Marshal.SizeOf(Type.GetType("System.Byte"));
    }

it does function also with .NET on Windows...

OK, my target is Mono on *nix, but I cannot assume that
all the users of our software are running Linux...

Thanks,
Gius_. 


>-- Original Message --
>From: Marcus <mathpup@mylinuxisp.com>
>To: "Giuseppe Greco" <gius.greco@bluewin.ch>
>Subject: Re: [Mono-list] Marshal.SizeOf() vs. sizeof operator
>Cc: mono-list@ximian.com
>Date: Tue, 12 Aug 2003 16:34:38 -0500
>
>
>The sizeof operator can only be applied to valuetypes (e.g. char, int, struct)
>
>and not to reference types (classes). The sizeof operator is only available
>
>in unsafe code.
>
>Marshal.SizeOf() can be applied to an instance or a Type, and it returns
>the 
>unmanaged size of the object. Unlike the sizeof operator, Marshal.SizeOf()
>is 
>not restricted to valuetypes.
>
>I don't quite understand what you were saying about char types. Can you

>provide an example?
>
>As for custom classes, I suspect that you need to use the StructLayout
>attribute, such as [StructLayout(LayoutKind.Sequential)] or using
>explicit layout. The error on Rotor is System.ArgumentException: Type Class
>
>can not be marshaled as an unmanaged structure; no meaningful size or offset
>
>can be computed.
>
>
>
>
>On Tuesday 12 August 2003 7:29 am, Giuseppe Greco wrote:
>
>> Marshal.SizeOf() and the sizeof() operator
>> return the same result, so what's the real
>> difference between them?
>>
>> Until now, I've used Marshal.SizeOf()...
>> and with Mono on Linux it works fine.
>>
>> This morning I've had the good (or bad) idea
>> to test my code on Windows with .NET... and
>> the result was
>>
>> 1. Marshal.SizeOf() is unable to determine the
>>    type of custom classes
>>
>> 2. for char types, Marshal.SizeOf() always returns
>>    "System.byte[]" instead of "System.Char"
>_______________________________________________
>Mono-list maillist  -  Mono-list@lists.ximian.com
>http://lists.ximian.com/mailman/listinfo/mono-list