Marshal.SizeOf (strurtureType) Всегда выдает ошибку

0

Ниже приведен фрагмент кода

class Program
{
    static void Main(string[] args)
    {
        Program.GetState(new State() { enabled = true, currentLimit = 30 });
    }

    private static void GetState(State result)
    {
        IntPtr Ptr = Marshal.AllocHGlobal(Marshal.SizeOf(result));
        Marshal.StructureToPtr(result, Ptr, false);
    }
}

[StructLayout(LayoutKind.Sequential)]
public struct State
{
    [MarshalAsAttribute(UnmanagedType.I8)]
    public uint currentLimit;
    [MarshalAsAttribute(UnmanagedType.I1)]
    public bool enabled;
}

Он всегда выдает ошибку, т.е.

Тип "MarshellingStructureSize.State" не может быть маршализирован как неуправляемая структура; никакие значимые размеры или смещение не могут быть вычислены.

Мое намерение состоит в том, чтобы отправить структуру для родной DLL через pInvoke, но когда я пытаюсь выделить память для моей структуры в управляемом коде через маршал, она всегда бросает выше ошибки.

Любая помощь будет принята с благодарностью.

Теги:
pinvoke

1 ответ

2
Лучший ответ

uint - фактически псевдоним для System.UInt32 который занимает 4 байта в памяти. Я думаю, что currentLimit не может быть преобразован в 8 байтов в памяти, поэтому вы получаете сообщение об ошибке.

[MarshalAsAttribute(UnmanagedType.I8)]
public uint currentLimit;

I8 для подписанного 8-байтового целого. попробуйте изменить его на U4 или I4.

[MarshalAsAttribute(UnmanagedType.U4)]
public uint currentLimit;

Или измените тип currentLimit на ulong как предложил @Hans Passant.

[MarshalAsAttribute(UnmanagedType.I8)] //or U8 
public ulong currentLimit;

это работает.

  • 0
    Правильно, или сделай это продолговатым.
  • 0
    @ HansPassant Конечно, это зависит от потребностей ОП. :) Я обновлю в своем ответе спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню