Я хотел бы создать экземпляр памяти для логического массива в C # и передать его функции библиотеки C с помощью взаимодействия.Затем функция C должна заполнить массив данными (результатом), чтобы данные могли быть переданы обратно в C # и использованы там.Поскольку массивы являются ссылочными типами, и поскольку я явно установил атрибут маршалинга [In, Out] для массива, я подумал, что это будет просто.Но, очевидно, нет.:-( Ниже приведен некоторый тестовый код (настолько простой, насколько я мог бы его получить), освещающий проблему.
В C вот что я назову:
extern "C" __declspec(dllexport) int __stdcall TestFillArray(bool *resultMaterials, int materialLength);
__declspec(dllexport) int __stdcall TestFillArray(bool *resultMaterials, int materialLength)
{
resultMaterials[0] = true;
resultMaterials[1] = true;
return materialLength;
}
Я вызываю эту функцию из C #, используя следующую декларацию:
[DllImport("FrontAuction2.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
public static extern int TestFillArray([MarshalAs(UnmanagedType.LPArray, SizeConst = 2), In, Out] bool[] resultMaterial, int materialLength);
, затем в моем методе тестирования C # у меня есть:
var resultMaterials = new bool[2];
var res = TestFillArray(resultMaterials, 2);
Когда я проверяю результат, я получаю res = 2 иresultMaterials [0] = true и resultMaterials [1] = false . Т.е. значение res является правильным, как и первый элемент массива, но не второй. Таким образом, похоже, что логические данныенеправильно упорядочено (если я не пропускаю что-то очевидное).
Я предполагаю, что можно было бы также объявить IntPtr вместо массива и успешно привести два элемента к правильному результату. Однако, так как я хочумассив, который будет выделен в памяти в C #, я не уверен, как это сделать.
Сильно благодарен за помощь по этому вопросу. Я вроде застрял здесь.: (
ОБНОВЛЕНИЕ: Я предполагаю, что это связано с этимлогическое значение имеет длину всего 1 байт, и код C # не получает эту информацию.Так как вы это укажете?