Не примитивное / Blittable исключение (.NET Core) - PullRequest
0 голосов
/ 05 июня 2018

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

1 Ответ

0 голосов
/ 06 июня 2018

Как указано здесь , код работал на моно, потому что в моно была ошибка.В моем случае, поскольку в моем массиве было только 2 позиции, я создал 2 поля, и проблема была решена

...