Прежде всего, я не совсем разбираюсь в сортировке и работе с неуправляемыми ресурсами.Я переносил проект, который был скомпилирован и запущен с mono и Framework v4.6.1.По сути, мне нужно было только изменить целевую среду, но одна вещь, которая заставила все перестать работать, была попытка закрепить объект в памяти с помощью GCHandle.Alloc
.Это вызвало исключение, утверждающее, что Unhandled Exception: System.ArgumentException: Object contains non-primitive or non-blittable data.
Что я нахожу странным, так это то, что это якобы (я принимаю слово владельца, когда он говорит, что он работает успешно ), это работает при работе сМоно.Есть ли разница в том, как ядро .NET и Mono обрабатывают память?
Исключение выдается, когда я делаю следующее:
private ws2811_t _ws2811;
private GCHandle _ws2811Handle;
public WS281x(Settings settings)
{
_ws2811 = new ws2811_t();
//Pin the object in memory. Otherwise GC will probably move the object to another memory location.
//This would cause errors because the native library has a pointer on the memory location of the object.
_ws2811Handle = GCHandle.Alloc(_ws2811, GCHandleType.Pinned);
Вот объект, который я пытаюсь закрепить:
[StructLayout(LayoutKind.Sequential)]
internal struct ws2811_t
{
public long render_wait_time;
public IntPtr device;
public IntPtr rpi_hw;
public uint freq;
public int dmanum;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = PInvoke.RPI_PWM_CHANNELS)]
public ws2811_channel_t[] channel;
}
[StructLayout(LayoutKind.Sequential)]
internal struct ws2811_channel_t
{
public int gpionum;
public int invert;
public int count;
public int strip_type;
public IntPtr leds;
public byte brightness;
public byte wshift;
public byte rshift;
public byte gshift;
public byte bshift;
public IntPtr gamma;
}
}
Я просмотрел оба моно Blittable типа и DotNet Blittable Types , но я не знаком с этимэто возможный баг или просто недоразумение с моей стороны?