Ниже приведен фрагмент кода
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, но когда я пытаюсь выделить память для моей структуры в управляемом коде через маршал, она всегда бросает выше ошибки.
Любая помощь будет принята с благодарностью.
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;
это работает.