Я однажды сделал что-то глупое в некотором взаимодействии (используя DllImport
), но это все равно работало на 32-битных машинах.
Что делается по-разному (и почему?) В 64-разрядном приложении, из-за чего метод 1 ведет себя по-разному?
Способ 1 (неверный путь):
ref byte param //Signature of `DllImport`ed function
ref myarray[0] //Parameter passed in when calling function
Метод 2 (правильный путь):
byte[] param //Signature of `DllImport`ed function
myarray //Parameter passed in when calling function
В любом случае, адрес, который в конечном итоге видит импортированная функция, должен быть таким же, как и адрес первого элемента массива. Поскольку массив будет размещаться в памяти непрерывно, я ожидал, что эти два метода будут эквивалентны.
Приложение скомпилировано для процессора типа «Любой». На 32-битной машине метод 1 и метод 2 работали и вели себя как ожидалось.
На 64-битной машине корректно работал только метод 2. При использовании метода 1 приложение могло видеть только первый элемент массива. Остальная часть массива была обнулена.