c # — Можем ли мы заменить все & quot; int & quot; параметр & amp; типы возврата с & quot; IntPtr & quot; в сигнатуре метода DllImport?

В моей программе у меня есть некоторые DllImportс, так как я хочу назвать некоторые нативные API. int тип используется для параметров метода & возвращает типы. Он работал довольно хорошо, пока я не запустил свое приложение на новом Windows 2012 R2 Server (64-разрядная версия). Проблема исправлена, когда я изменил один из ref тип параметра от int в IntPtr,

я знаю это IntPtr используется для представления указателя или дескриптора
Тем не менее, MSDN также говорит, что IntPtr «предназначен для целого числа», размер которого зависит от платформы. Так что если IntPtr способен обрабатывать платформу определенного размера целого числа, можно ли заменить все int параметры & типы возврата с IntPtr?

Я использую C # .NET 4.0.

1

Решение

Нет, вы не можете делать это вслепую. В 64-битном коде по-прежнему широко используются 32-битные целочисленные типы, а их «родное целое число» все еще является 32-битным значением. Если вы видите ИНТ или долго в объявлении собственного кода (или эквивалентном псевдониме typedef), то вы все еще используете ИНТ в вашем объявлении pinvoke.

Хотя это может показаться не очень разумным для 64-битного компилятора, есть очень веская причина, по которой они не обновили свой собственный целочисленный тип. Современные процессоры необычайно быстры, но ограничены скоростью, с которой они могут обращаться к памяти. Их исполнительные механизмы работают на гигагерцовых скоростях, но шина памяти ледяно медленная. Проблема с электрической схемой, связанная с расстоянием, чем дальше должен пройти сигнал, тем медленнее необходимо изменить состояние, чтобы все еще правильно распознаваться на другом конце провода. Проблема решена частично с помощью кэши, копии памяти, расположенные рядом с механизмом исполнения. Эти тайники не удваиваются в размере. Эффективное использование кешей очень важно для скорости, поэтому важно использовать 32-битные интегральные значения, где это возможно.

Примеры нативных типов, которые являются IntPtr — это любой тип указателя, size_t, XXX_PTR, WPARAM, LRESULT. Последние являются typedef, они могут затруднить распознавание базового типа. Если вы сомневаетесь, напишите небольшую программу на C, которая использует sizeof так что вы знаете факт.

Формальное определение модель данных используется 64-битным собственным компилятором. Компиляторы Microsoft используют LLP64.

3

Другие решения

можно ли заменить все параметры int & возвращаемые типы с IntPtr

Нет, это не так. Вам нужно будет рассмотреть каждый вариант использования в отдельности. Если требуется указатель (например, для получения вывода), тогда IntPtr скорее всего, будет правильным, потому что он будет иметь правильный размер для ширины указателя платформы, как вы узнали.

A C # int 32-битный независимо от того, является ли базовая ОС 32 или 64 битной и будет соответствовать соответствующим типам параметров фиксированной ширины в Win32 API. LONG один пример с DWORD как его неподписанный эквивалент. Там другие, многие другие…

1

По вопросам рекламы [email protected]