В моей программе у меня есть некоторые DllImport
с, так как я хочу назвать некоторые нативные API. int
тип используется для параметров метода & возвращает типы. Он работал довольно хорошо, пока я не запустил свое приложение на новом Windows 2012 R2 Server (64-разрядная версия). Проблема исправлена, когда я изменил один из ref
тип параметра от int
в IntPtr
,
я знаю это IntPtr
используется для представления указателя или дескриптора
Тем не менее, MSDN также говорит, что IntPtr
«предназначен для целого числа», размер которого зависит от платформы. Так что если IntPtr
способен обрабатывать платформу определенного размера целого числа, можно ли заменить все int
параметры & типы возврата с IntPtr
?
Я использую C # .NET 4.0.
Нет, вы не можете делать это вслепую. В 64-битном коде по-прежнему широко используются 32-битные целочисленные типы, а их «родное целое число» все еще является 32-битным значением. Если вы видите ИНТ или долго в объявлении собственного кода (или эквивалентном псевдониме typedef), то вы все еще используете ИНТ в вашем объявлении pinvoke.
Хотя это может показаться не очень разумным для 64-битного компилятора, есть очень веская причина, по которой они не обновили свой собственный целочисленный тип. Современные процессоры необычайно быстры, но ограничены скоростью, с которой они могут обращаться к памяти. Их исполнительные механизмы работают на гигагерцовых скоростях, но шина памяти ледяно медленная. Проблема с электрической схемой, связанная с расстоянием, чем дальше должен пройти сигнал, тем медленнее необходимо изменить состояние, чтобы все еще правильно распознаваться на другом конце провода. Проблема решена частично с помощью кэши, копии памяти, расположенные рядом с механизмом исполнения. Эти тайники не удваиваются в размере. Эффективное использование кешей очень важно для скорости, поэтому важно использовать 32-битные интегральные значения, где это возможно.
Примеры нативных типов, которые являются IntPtr — это любой тип указателя, size_t, XXX_PTR, WPARAM, LRESULT. Последние являются typedef, они могут затруднить распознавание базового типа. Если вы сомневаетесь, напишите небольшую программу на C, которая использует sizeof
так что вы знаете факт.
Формальное определение модель данных используется 64-битным собственным компилятором. Компиляторы Microsoft используют LLP64.
можно ли заменить все параметры int & возвращаемые типы с IntPtr
Нет, это не так. Вам нужно будет рассмотреть каждый вариант использования в отдельности. Если требуется указатель (например, для получения вывода), тогда IntPtr
скорее всего, будет правильным, потому что он будет иметь правильный размер для ширины указателя платформы, как вы узнали.
A C # int
32-битный независимо от того, является ли базовая ОС 32 или 64 битной и будет соответствовать соответствующим типам параметров фиксированной ширины в Win32 API. LONG
один пример с DWORD
как его неподписанный эквивалент. Там другие, многие другие…