C # взаимодействие с указателем массива как короткий без небезопасных - PullRequest
0 голосов
/ 03 декабря 2018

Я совершенно неопытен в Interop в C # и сейчас борюсь с проблемой Pointer.У меня есть внешняя скомпилированная DLL и C # API (не могу там что-то изменить).Сам код взаимодействия выглядит (и должен быть изменен бот)

[DllImport("FWLIB32.dll", EntryPoint="cnc_rdcurrent")]
public static extern short cnc_rdcurrent( ushort FlibHndl, out short a );

Вторым аргументом (по документации) является адрес короткого массива, в который внешний вызов помещает данные.Фактический размер определяется во время выполнения.

В настоящее время я думаю о чем-то вроде (не проверено)

            short* c = stackalloc short[N];
            for (int i = 0; i < N; i++) c[i] = 0;
            short cc = (short)c;

            int NCReadCode = Focas1.cnc_rdcurrent(flibHndl, out cc);

Но для этого нужен небезопасный код.Поскольку остальная часть приложения полностью безопасна (другие члены API используют предопределенные структуры вместо явных адресов памяти)

Итак, есть ли способ сделать это без небезопасного кода?(Во-вторых, если вы обнаружите недостатки в моей идее, я также буду рад услышать;))

Спасибо всем!

1 Ответ

0 голосов
/ 03 декабря 2018

Итак, если количество элементов N известно и определено в другом месте, как указано выше, я бы рекомендовал следующее:

[DllImport("FWLIB32.dll", EntryPoint="cnc_rdcurrent")]
public static extern short cnc_rdcurrent( ushort FlibHndl, ref short[] crrnt );

При использовании:

// Create result array, reserve memory on managed heap
// Items are initialized to 0 by default
short[] resultArray = new short[N];

int NCReadCode = Focas1.cnc_rdcurrent(flibHndl, ref resultArray);

ТакВаша управляемая сборка отвечает за управление памятью массива, а неуправляемая DLL копирует результат в предварительно выделенную память.Небезопасный код не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...