"My cat, as it turns out, is an excellent debugger, and she has helped me solve a number of nasty bugs when I talked to her about them."
John Robbins, Debugging Applications, Microsoft Press, 2000
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */

Две платформы - один код

Вступление

Если вы достаточно давно занимаетесь программированием приложений для Windows Mobile, то, наверняка, пробовали (случайно или осознанно) запустить приложение двойным щелчком на настольном компьютере. Если вы везучий человек, то ваша программа, изначально написанная для Windows Mobile, могла спокойно заработать и на обычном компьютере. Те, кто еще не пробовал, могут написать традиционное приложение Здравствуй, мир! и запустить его.

Естественно, возникает вопрос - а нельзя ли написать программу сразу для двух платформ? Ответ будет простым - можно! Но, если вы решились на подобный шаг, то должны знать о различных препятствиях, которые вам предстоит преодолевать.

Отличия двух платформ

Во-первых, сразу зарубите себе на носу. Можно создать исполняемый файл приложения, создаваемого для Windows Mobile, и запустить его на настольном компьютере, но нельзя поступить наоборот. Любое стандартное приложение Windows не запустится на мобильном устройстве. Что выглядит достаточно логичным, иначе зачем было создавать отдельные шаблоны проектов Smart Device? Когда-нибудь в будущем начинка мобильных компьютеров не будет уступать большим собратьям и программистам не понадобится скачивать Windows Mobile SDK (Рекламная пауза: Нет сынок, это фантастика!)

Перейдем собственно к отличиям.

.NET Compact Framework является подмножеством полной .NET Framework, но своими особенностями: размеры форм, зависимость от заряда батарей, поведение приложений, управление устройствами ввода и т.д.

Кроме того, .NET Compact Framework включает в себя несколько собственных библиотек, которых нет в полной .NET Framework: Microsoft.WindowsCE.Forms, System.Net.IrDA and System.Data.SqlServerCe. Также следует заметить, что существует еще отдельная библиотека WindowsMobile, которая не относится к .NET Compact Framework и уж тем более никак не связана с десктопным фреймворком.

Файловая система на двух платформах также кардинально отличается. На мобильных устройствах нет понятия дисков A:\, C:\ и т.д. (любимая команда format c: здесь не прокатит).

Еще одно отличие - разные названия многих системных библиотечных файлов. Что это значит? Если вы будете использовать в вашей программе неуправляемые вызовы функций Windows API через технологию Platform Invoke (P/Invoke), то нарветесь на ошибке. На мобильных устройствах нет файлов user32.dll, kernel32.dll и так далее.

Разделение кода

Если вы уже съели собаку (вы китаец?) на отличиях, то можете разделить проблемные участки кода таким образом, чтобы часть вашего гениального творения исполнялась на настольном компьютере, а часть только на мобильном устройстве. Для этого вам надо воспользоваться директивой препроцессора #if Device следующим образом:

#if DEVICE
// Здесь ваш код для мобильного устройства
#else
// Здесь ваш код для настольного компьютера
#endif
Реклама