none
Microsoft Visual Studio 2012 Professional - один проект под все платформы RRS feed

  • Вопрос

  • Всем доброго вечера!

    У меня стоят следующие продукты:

    1. Microsoft Visual Studio 2012 Express для Windows Phone
    2. Microsoft Visual Studio 2012 Express для Windows 8
    3. Microsoft Visual Studio 2012 Express для Desktop

    Первым я пока не пользуюсь, а вот второй и третий мне нужны. Разрабатываю игру, которая будет работать и в магазине Windows и для рабочего стола. И в данный момент у меня в папке проектов лежат два отдельных проекта, которые я собираю для каждой из платформ. Надоело мне такое дублирование кода. Даже если я и объединю общий код в отдельную папку, то при любом добавлении файлов, мне придётся их добавлять в оба проекта. В общем не совсем всё удобно.

    Сейчас вот обратил внимание на Microsoft Visual Studio 2012 Professional. Знаю что из под одной этой IDE можно вести разработку сразу на все интересующие меня платформы (по крайней мере проекты будут запускаться от разных платформ в одной IDE). Меня интересует же следующий момент: возможно ли из под этой Microsoft Visual Studio 2012 Professional создать всего один проект, то есть и один код у него, просто определяя по define для какой платформы идёт разработка и с помощью #ifdef/#ifndef я буду подключать только нужный код (там где не сохраняется кроссплатформенность). И в результате при компиляции мне надо будет только поменять платформу (поменяются define) и всё из под одного проекта скомпилируется. Хотя сомнительное занятие, ведь у одной платформы эмуляторы, у другой нет и так далее...кажется фантастикой всё это в одно.

    Я не знаю возможно ли это, я не работал с Professional (и более продвинутыми) версиями. Вот хочу послушать мнение тех, кто знает как лучше решить данную проблему. А то может и нет смысла выкладывать 16000 рублей, если не получу то, что хочу.

    Как вообще стоит организовать такой проект, который нужно собирать, скажем под Windows магазин, под рабочий стол и под телефон?

    Спасибо за внимание!

    3 февраля 2013 г. 14:19

Ответы

  • Сергей, прошу прощения, видимо у вас русская версия Visual Studio, а я ее не видел.

    Вот так выглядит это проект в английской версии:

    При создании такого типа проекта, открывается окно, в котором вы указываете, совместимость с чем вам необходима:

    Чем больше вы поставите галочек, тем больше ограничений будет накладываться на проект. Так, если вы оставите галки как на скриншоте, то разместить компоненты пользовательского интерфейса у вас в такой сборке не получится, т.к. XAML у классических приложений, Windows Store, Windows Phone и Silverlight существенно отличается.

    Такие сборки можно использовать для реализации бизнес-логики. Т.е. вы делаете 4 проекта с пользовательским интерфейсом и один проект с логикой, по которой он должен работать (например, в рамках паттерна MVVM).

    Как то так...

    4 февраля 2013 г. 6:11
    Отвечающий
  • Вынести логику в отдельную библиотеку и превратить  ее код в спагетти #ifdef'ами.
    • Помечено в качестве ответа Abolmasov Dmitry 8 февраля 2013 г. 12:48
    4 февраля 2013 г. 8:31
    Модератор
  • Привет

    Предопределенные макросы в Visual Studio описаны здесь - Predefined Macros

    Но также вы сами можете определить макрос для каждой платфоры. Для этого зайдите в свойства проекта, выберите вверху необходимую платформу, потом перейдите в раздел C/C++ и найдите там опцию Preprocessor Definition, в ней укажите название макроса для данной платформы.

    Повторите эти действия для других платформ, а потом в коде вы сможете создавать условия включения файлов в зависимости от платформы, как вы привели выше

    Надеюсь это решит вашу проблему


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 8 февраля 2013 г. 12:48
    6 февраля 2013 г. 8:15

Все ответы

  • Пусть меня поправят, если я не прав, но насколько мне известно наличие даже самой продвинутой версии не позволит вам создавать кроссплатформенный проект.

    Скорее всего ваш текущий подход единственный.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    3 февраля 2013 г. 18:58
  • Поставил сейчас VS 2012 Pro для ознакомления. Нашёл там при создании проекта вкладу Общее и тип проекта Пустой. Самое интересное, что это общее находится рядом с пунктами Win32, Windows Store и Windows Phone. Это никак нельзя использовать для моей цели? Если кто знает что можно из этого сделать, расскажите.
    3 февраля 2013 г. 19:02
  • Сергей, прошу прощения, видимо у вас русская версия Visual Studio, а я ее не видел.

    Вот так выглядит это проект в английской версии:

    При создании такого типа проекта, открывается окно, в котором вы указываете, совместимость с чем вам необходима:

    Чем больше вы поставите галочек, тем больше ограничений будет накладываться на проект. Так, если вы оставите галки как на скриншоте, то разместить компоненты пользовательского интерфейса у вас в такой сборке не получится, т.к. XAML у классических приложений, Windows Store, Windows Phone и Silverlight существенно отличается.

    Такие сборки можно использовать для реализации бизнес-логики. Т.е. вы делаете 4 проекта с пользовательским интерфейсом и один проект с логикой, по которой он должен работать (например, в рамках паттерна MVVM).

    Как то так...

    4 февраля 2013 г. 6:11
    Отвечающий
  • Вам нужно разбить приложение на несколько проектов. Логику вынести в Portable Library. А эту библиотеку использовать Store и Desktop приложениях. Более подробную информацию смотрите тут.
    4 февраля 2013 г. 6:14
    Модератор
  • Вопрос к Алексею и ulcer, который интересует меня и думаю не мало важен для автора проекта.

    Вот у меня было приложение на desctop. В его бизнес логике была загрузка данных из сети и разбор их на удобный вид. Как мне поможет Portable Library, если классы загрузки из сети в проектах WinRT и, например, WPF разные.

    Я не использовал Portable Library, поэтому в рамках данного вопроса буду рад если вы раскроете тему по шире.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    4 февраля 2013 г. 6:18
  • LXGDARK, классически, такие вещи разруливаются на интерфейсах.

    Т.е. у вас есть бизнес-логика, котрая для работы с данными имеет ссылку на интерфейс с методами: загрузить, изменить, сохранить... Вы эту бизнес-логику выносите в Partial Library, ну а дальше, в проекте под Desctop, вы подключаете Partial сборку и сборку с классами доступа конкретными для данной платформы (с поддержкой описанного интерфейса). Создаете объект доступа к данным, сздаете VM или Controller и передаете в него этот объект по ссылке на интерфейс.

    4 февраля 2013 г. 6:34
    Отвечающий
  • LXGDARK, классически, такие вещи разруливаются на интерфейсах.

    Т.е. у вас есть бизнес-логика, котрая для работы с данными имеет ссылку на интерфейс с методами: загрузить, изменить, сохранить... Вы эту бизнес-логику выносите в Partial Library, ну а дальше, в проекте под Desctop, вы подключаете Partial сборку и сборку с классами доступа конкретными для данной платформы (с поддержкой описанного интерфейса). Создаете объект доступа к данным, сздаете VM или Controller и передаете в него этот объект по ссылке на интерфейс.

    То есть максимум чего мы добьемся это стандартизация и расширяемость, а рутина с разным кодом для разных проектов все равно остается?

    Я как разработчик любитель с паттернами вообще не дружу, поэтому зачастую опускаю и редко помню про то, что бывают команды разработчиков и т.п.

    Ведь насколько я понял в идеале для каждого типа проекта своя команда разработчиков (или разработчик), а Partial Library это своего рода каркас приложения.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    4 февраля 2013 г. 6:48
  • Да, разные проекты под разные платформы останутся. Логика в Partial Library, а все остальное: интерфейс, работа с файлами, сетью и т.д. Будут в каждом проекте свои. Ну может что-то еще получится собрать в Partial Library, например, если у вас доступ к данным в WPF и Silverlight проекте идет через RIA сервисы...
    4 февраля 2013 г. 6:56
    Отвечающий
  • Я уже будто бы обрадовался, но оказывается что всё что Вы тут написали, применимо к языку C# (возможно и к Basic). Я не уточнил, я пишу на C++. А в проектах Visual C++ нету создания такой библиотеки.

    Есть какие-то идеи?

    4 февраля 2013 г. 8:18
  • Вынести логику в отдельную библиотеку и превратить  ее код в спагетти #ifdef'ами.
    • Помечено в качестве ответа Abolmasov Dmitry 8 февраля 2013 г. 12:48
    4 февраля 2013 г. 8:31
    Модератор
  • Библиотеку сложно отлаживать.

    Что же придумать-то. 

    4 февраля 2013 г. 8:45
  • Библиотеку сложно отлаживать.

    Что же придумать-то. 


    Пиши юнит тесты. В 2012 версии это точно можно делять для С++.
    4 февраля 2013 г. 11:33
    Модератор
  • А зачем мне тесты?

    Я хочу из под одной IDE без загрузки проектов, с помощью переключения флага компилировать под разные платформы. Это как при Debug/Release, как при x86/x64/ARM, при переключении разные свойства проекта, разные включённые файлы. А если при этом переключении ещё и какие-то define определяются, то тогда и в коде можно сделать #ifden/#ifndef и для Desktop подключать File_WinDS, для Windows Store, подключать File_WinRT.

    Там же есть пустой проект. Создаёшь и у тебя ничего вообще нет. Может быть туда как-то добавлять разные настройки (есть диспетчер свойств)? Знать только что добавлять и как потом переключать. Никто ничего такого не мутил?

    4 февраля 2013 г. 11:46
  • А зачем мне тесты?

    Я хочу из под одной IDE без загрузки проектов, с помощью переключения флага компилировать под разные платформы. Это как при Debug/Release, как при x86/x64/ARM, при переключении разные свойства проекта, разные включённые файлы. А если при этом переключении ещё и какие-то define определяются, то тогда и в коде можно сделать #ifden/#ifndef и для Desktop подключать File_WinDS, для Windows Store, подключать File_WinRT.

    Там же есть пустой проект. Создаёшь и у тебя ничего вообще нет. Может быть туда как-то добавлять разные настройки (есть диспетчер свойств)? Знать только что добавлять и как потом переключать. Никто ничего такого не мутил?

    Когда создаем проект из шаблона VS делает много рутины. Пустой проект это пустой проект и значит вам нужно понять что за рутина делается при создании проекта из шаблона и сделать ее самостоятельно с разделением на платформы.

    К слову стоит поискать в списке загружаемых шаблонов, может кто то что то такое уже и смастерил.

    Лично я пятой точкой чую, что не все так просто в нашей жизни и вам все таки придется продолжать делать проекты параллельно.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    4 февраля 2013 г. 11:53
  • Partial Library, это не более чем удобство для разработчика.

    Вы также можете вести разработку двух проектов, которые будут пользоваться одним файлом с кодом.

    Создаете Solution, включаете в него два проекта, под разные платформы (когда вы будите запускать построение, у вас будут собираться оба проекта). Включить в один из них файл с логикой, а во второй этот же файл добавить как ссылку. Теперь, у вас один файл с кодом в двух проектах, причем при внесении изменений будет проверяться, билдиться ли он в двух решениях. Единственный недостаток в том, что вам самому придется определять, что включать в этот файл, а что нет. Проверять можно ли это добавлять будет построение решения. В Partial Library за вас эту проверку делает VS до билда, еще на этапе написания кода...

    4 февраля 2013 г. 12:14
    Отвечающий
  • Смотрел шаблоны из Интернета, ничего не нашёл, чтобы как-то напоминало то что нужно.

    Я вот к чем, если открыть студию, то мы увидем вот что:

    Создаётся пустой проект (то есть без файлов). Но у него есть какие-то свойства:

    Видно что свойства говорят нам про Desktop приложение. У нас есть панель, где мы можем выбрать конфигурацию и архитектуру:

    Изменим (точнее добавим) архитектуру на x64 или ARM, у нас появится новые страницы свойств (можно создать пустые или из существующих). Но возможно ли как-то переключать платформу? Если возможно, то как?

    Вот идеальный вариант, это понять можно ли переключать платформу. Платформа, это свои странички свойств, к примеру. То есть все новые cpp и h файлы добавляются в проект, а уже по желанию некоторые можно исключить из построения для выбранной платформы. Ну и в коде чтобы по какой-то define, ну к примеру:

    #ifdef PLATFORM_RT
    #include "File_RT"
    #else
    #include "File_DS"
    #endif

    Можно ли как-то такое смастерить в одном проекте?

    А то может есть смысл подумать как это дело в одно решение засунуть. В решение несколько проектов. Хотя нет, опять же косяк, даже логику библиотеки придётся писать для каждой платформы. Ведь там нет универсальной библиотеки, придётся свой проект lib для каждой платформы. В общем пришли к началу. Не хочется через bat всё делать. Есть идеи?

    4 февраля 2013 г. 12:22
  • Привет

    Предопределенные макросы в Visual Studio описаны здесь - Predefined Macros

    Но также вы сами можете определить макрос для каждой платфоры. Для этого зайдите в свойства проекта, выберите вверху необходимую платформу, потом перейдите в раздел C/C++ и найдите там опцию Preprocessor Definition, в ней укажите название макроса для данной платформы.

    Повторите эти действия для других платформ, а потом в коде вы сможете создавать условия включения файлов в зависимости от платформы, как вы привели выше

    Надеюсь это решит вашу проблему


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 8 февраля 2013 г. 12:48
    6 февраля 2013 г. 8:15