Почему (неправильно) использование ref myarray [0] для передачи в массиве работает, но только в 32-битных приложениях? - PullRequest
2 голосов
/ 10 ноября 2010

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

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

64-битная платформа может копировать в некоторое пространство временного хранения перед вызовом функции, а затем копировать эти данные обратно в исходный параметр ref после завершения функции.

0 голосов
/ 10 ноября 2010

Полагаю, вы загружаете разные версии самой dll ... 64-битное приложение не может загрузить ту же 32-битную версию dll, которая была загружена при запуске под x86, поэтому указывать на другую DLL. 64-битная версия dll должна обрабатывать параметры другим способом.

Какую DLL вы загружаете? Будет ли это что-то обрабатывать WinSxs?

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