Может ли приложение .NET, предназначенное для «любого процессора», использовать вызовы P / Invoke в нескольких средах? - PullRequest
4 голосов
/ 13 апреля 2010

У меня есть приложение .NET, которое использует некоторые вызовы API, например, GetPrivateProfileString . До сих пор он всегда работал на 32-битных машинах.

Чтобы работать на 64-битных машинах, я должен изменить «Platform Target» на «x86»? Или есть способ сообщить среде выполнения, какую API DLL вызывать в зависимости от среды выполнения?

Ответы [ 2 ]

4 голосов
/ 14 апреля 2010

У вас не возникнет проблем, если библиотека DLL, экспорт которой вы P / Invoke, также доступен в 64-битной версии. Который определенно имеет место для библиотек Windows, таких как kernel32.dll. GetPrivateProfileString () будет работать так же хорошо, вам не нужно изменять атрибут [DllImport]. Предполагая, что вы использовали IntPtr, где это необходимо.

Шансы уменьшаются, когда вы используете стороннюю DLL или COM-сервер, который устарел или не включен в Windows. Вы быстро узнаете, требуется ли переопределение платформы x86 Target, исключение времени выполнения достаточно громкое. Вы получите исключение BadImageFormat для привязанных библиотек DLL, 32-разрядные COM-серверы выдают исключение «Класс не зарегистрирован».

4 голосов
/ 13 апреля 2010

Необходимо убедиться, что вы используете только вызовы P / Invoke для 64-битной DLL.

Один из вариантов - переместить все ваши «методы» в стандартный интерфейс (или абстрактный базовый класс) и предоставить 2 реализации, одну 32-битную и одну 64-битную. У вас может быть метод фабрики, создающий соответствующий экземпляр класса в зависимости от размера IntPtr.

Это позволяет приложению «AnyCPU» корректно во время выполнения определять, в какую библиотеку DLL выполнить P / Invoke, и работает ли она.

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