C# Marshal.SizeOf

Я использую Marshal.SizeOf, чтобы узнать размер моей структуры:

struct loginStruct
{
    public string userName;
    public string password;

    public loginStruct(string userName, string password)
    {
        this.userName = userName;
        this.password = password;
    }
}

Вот использование этой функции:

int len = Marshal.SizeOf(typeof(loginStruct));

Я получил 2 программы. В одной программе len равно 8. В другой - 16. Это та же самая структура. Почему я получил эту разницу?

3 ответа

Решение

Я предполагаю, что одна программа скомпилирована для AnyCPU (которая на 64-битной платформе будет 64-битной), а другая - для 32-битной.

Методы не влияют на заданный размер, поэтому мы говорим о следующем:

struct loginStruct
{
    public string userName;
    public string password;
}

Тот struct имеет два поля ссылочного типа. Как таковой, он имеет два поля в памяти, которые относятся к объектам в куче, или к null,

Все поля ссылочного типа составляют 4 байта в 32-битном.NET и 8 байтов в 64-битном.NET.

Следовательно, размер будет 4 + 4 = 8 в 32-битном.NET или 8 + 8 = 16 в 64-битном.NET.

Это зависит от машины и конфигурации сборки. Как сказал @Joey AnyCPU или 64-битный

Есть несколько хитростей, чтобы избежать этой проблемы:

Например, вы можете проверить:

  • Тип приложения Environment.Is64BitOperatingSystem

  • Размер IntPtr меняется на 32 и 64

  • использование System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32DeviceMgmt.SP_DEVINFO_DATA)

Другие вопросы по тегам