Почему VB Len (x) сообщает другое значение, чем C # System.Runtime.Службы взаимодействия.Marshal.SizeOf(x)?

#c# #vb.net

#c# #vb.net

Вопрос:

VB:

 Structure WAVEFORMATEX
    Dim FormatTag As Short
    Dim Channels As Short
    Dim SamplesPerSec As Integer
    Dim AvgBytesPerSec As Integer
    Dim BlockAlign As Short
    Dim BitsPerSample As Short
    Dim Size As Short
End Structure
 

C#:

     struct WAVEFORMATEX
    {
        public short FormatTag;
        public short Channels;
        public int SamplesPerSec;
        public int AvgBytesPerSec;
        public short BlockAlign;
        public short BitsPerSample;
        public short Size;
    }
 

VB Len() возвращает 18. C # System.Runtime.Службы взаимодействия.Marshal.SizeOf() возвращает 20. Есть идеи, почему?

Комментарии:

1. это потому, что Marshal.SizeOf() возвращает точный размер выравнивания в 4 байта (для сортировки типов в неуправляемый код). Последнее сокращение в структуре дополняется до кратного 4 байтам для маршалинга (предполагается, что вы компилируете для целевого 32-разрядного)

2. @MitchWheat молодец, что понял точную разницу. Не стесняйтесь редактировать его в моем ответе.

Ответ №1:

Документы о Strings.Len состоянии:

Если an Object содержит какой-либо другой тип, он вернет размер объекта, поскольку он будет записан в файл FilePut функцией.

При этом используется довольно сжатый формат.

Тогда Marshal.SizeOf как используется для вычисления размера для взаимодействия, например Marshal.StructureToPtr , с . Это часто может дополнять небольшие значения до 32 или 64 бит, увеличивая размер.

Итак, алгоритм отличается, потому что конечная цель отличается.

Комментарии:

1. Можете ли вы порекомендовать более близкий эквивалент в C # для того, что Len() делает в VB?

2. Нет, потому FilePut что это не то, что имеет какой-либо эквивалент в C #. Вы все равно можете вызвать Len и FilePut , добавив Microsoft.VisualBasic в качестве ссылки.