none
Перенос проекта (c#, winform) из VS 2008 в VS 2012 RRS feed

  • Вопрос

  • Здравствуйте. Столкнулся с проблемой переноса проекта, созданного в VS 2008 на Framework 2.0, в новую студию VS 2012. Проект представляет из себя dll библиотеку, с несколькими классами.

    Во всех классах, помимо методов, объявлены автоматические свойства, например:

    public int Value { get; set;}

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

    get должен объявлять тело, так как он не помечен как абстрактный или внешний 

    set должен объявлять тело, так как он не помечен как абстрактный или внешний

    Но если создать проект с нуля в VS 2012, с такими же классами, то ошибок нет.

    При сравнении файлов csproj преобразованного проекта и созданного с нуля, обнаружил следующее отличие:

    У преобразованного проекта прописано Project ToolsVersion="2.0", а у нового - Project ToolsVersion="4.0". Если поменять цифру 2 на 4 у преобразованного проекта, то проект скомпилируется без ошибок.

    В msdn я не нашел четкого описания для поля ToolsVersion,  что все-таки значит это поле? Почему его нет в свойствах проекта? Как оно зависит от используемого Framework? Проект должен работать на Framework 2.0. Почему при конвертации проекта значение поля ToolsVersion осталось 2.0? Какие дадите рекомендации при переносе старых проектов? Приложения должны работать в операционных системах версии не ниже win xp.

     


    12 февраля 2013 г. 6:36

Ответы

  • So in essence, specifying a ToolsVersion value at the command line is essentially equivalent to choosing from a predefined set of valid values for $(MSBuildBinPath).

    Оригинал

    • Предложено в качестве ответа Abolmasov Dmitry 13 февраля 2013 г. 13:19
    • Отменено предложение в качестве ответа ZhoZho 13 февраля 2013 г. 17:51
    • Помечено в качестве ответа Abolmasov Dmitry 20 февраля 2013 г. 11:17
    12 февраля 2013 г. 8:30

Все ответы

  • А в свойствах проекта Target Framework какое имеет значение?
    12 февраля 2013 г. 6:42
  • Только что попробовал конвертануть проект 2008 -> 2012 с таким же свойством - все прошло нормально, с некоторыми Warning:

    Your project is targeting .NET Framework 2.0 or 3.0. If your project uses assemblies requiring a newer .NET Framework, your project will fail to build. You can change the .NET Framework version by clicking Properties on the project menu and then selecting a new version in the '.NET Framework' dropdown box.

    Visual Studio needs to make non-functional changes to this project in order to enable the project to open in this version and Visual Studio 2010 SP1 without impacting project behavior.

    У вас SP1 для студии стоит?

    12 февраля 2013 г. 7:23
  • Кирилл, да, SP1 для студии стоит. Я провел еще несколько тестов и вот что обнаружил и узнал у коллег:

    Сборка, в которой есть проекты с подобными свойствами, была перенесена в vs 2008 еще из vs 2005. В этих проектах в файлах csproj прописано Project ToolsVersion="2.0". При переносе таких проектов в VS 2012 появляется указанная выше ошибка. НО если создать проект с нуля в VS 2008, то в файлах csproj прописано Project ToolsVersion="3.5" и при переносе такого проекта в VS 2012 ошибка не возникает. Получается, что проекты с ToolsVersion="2.0" переносятся с ошибкой. До конца не ясно что это за ToolsVersion такой? Как он завязан на framework и версию языка? И почему это "поле" не вынесено в настройки проекта?

    P.S. Повторюсь все проекты созданы на framework 2.0. 

     
    12 февраля 2013 г. 8:09
  • So in essence, specifying a ToolsVersion value at the command line is essentially equivalent to choosing from a predefined set of valid values for $(MSBuildBinPath).

    Оригинал

    • Предложено в качестве ответа Abolmasov Dmitry 13 февраля 2013 г. 13:19
    • Отменено предложение в качестве ответа ZhoZho 13 февраля 2013 г. 17:51
    • Помечено в качестве ответа Abolmasov Dmitry 20 февраля 2013 г. 11:17
    12 февраля 2013 г. 8:30
  • Спасибо за ссылку. Стало все на много понятнее в этой запутанной теме. Но остался последний вопрос. Почему в студиях VS 2012 и VS 2008 при одинаковом ToolsVersion="2.0" получается разный результат? Ведь NET Framework install path  один и тот же.
    12 февраля 2013 г. 9:01
  • Вот это к сожалению не знаю... У меня проект сконверитровался без проблем.
    12 февраля 2013 г. 9:17
  • ZhoZho,

    Вот информация по атрибуту ToolsVersion: http://msdn.microsoft.com/ru-ru/library/bb383796(v=vs.90).aspx

    • Принцип действия атрибута ToolsVersion

      При создании нового или обновлении существующего проекта в Visual Studio 2008 атрибут с названием ToolsVersion автоматически включается в файл проекта и получает по умолчанию значение "3.5". Дополнительные сведения см. в разделе Указание конкретной платформы .NET Framework.

      Если значение ToolsVersion определено в файле проекта, MSBuild с помощью этого значения определяет значения для $(MSBuildToolsPath) (или $(MSBuildBinPath)) — пути к инструментам MSBuild. Если значение ToolsVersion не определено, MSBuild продолжает использовать прежний путь к набору инструментов, исходя из предположения, что проект является проектом Visual Studio 2005.

      Если существующий проект Visual Studio 2005 открыть в Visual Studio 2008, он физически "обновляется" за счет включения назначения "ToolsVersion=3.5", поскольку Visual Studio 2008 поддерживает только построение с помощью набора инструментов версии 3.5. В результате, когда проект создается в Visual Studio 2008, в нем используется набор инструментов Visual Studio 2008 (3.5) вместо набора инструментов Visual Studio (2.0).

      Проекты, созданные с помощью набора инструментов версии 2.0, могут предназначаться для .NET Framework 2.0, а проекты, созданные с помощью набора инструментов версии 3.5 — для .NET Framework версии 2.0, 3.0 или 3.5. Даже в том случае, если была выполнена миграция проекта Visual Studio в Visual Studio 2008 и обновление для использования набора инструментов версии 3.5, требуемой версией .NET Framework для проекта останется .NET Framework 2.0. Этим гарантируется, что в случае выполнения миграции проекта в Visual Studio 2008 не появятся новые зависимости. Построение проекта выполняется в точности так, как для Visual Studio.

    И еще информация по использованию Project.ToolsVersion и Project.DefaultToolsVersion:

    http://msdn.microsoft.com/ru-ru/library/microsoft.build.buildengine.project.toolsversion.aspx

    http://msdn.microsoft.com/ru-ru/library/microsoft.build.buildengine.project.defaulttoolsversion.aspx

    • Предложено в качестве ответа Abolmasov Dmitry 13 февраля 2013 г. 13:19
    • Помечено в качестве ответа ZhoZho 13 февраля 2013 г. 17:50
    • Снята пометка об ответе ZhoZho 13 февраля 2013 г. 17:52
    13 февраля 2013 г. 12:41
    Модератор
  • ZhoZho,

    Вот информация по атрибуту ToolsVersion: http://msdn.microsoft.com/ru-ru/library/bb383796(v=vs.90).aspx

    • Принцип действия атрибута ToolsVersion

      При создании нового или обновлении существующего проекта в Visual Studio 2008 атрибут с названием ToolsVersion автоматически включается в файл проекта и получает по умолчанию значение "3.5". Дополнительные сведения см. в разделе Указание конкретной платформы .NET Framework.

      Если значение ToolsVersion определено в файле проекта, MSBuild с помощью этого значения определяет значения для $(MSBuildToolsPath) (или $(MSBuildBinPath)) — пути к инструментам MSBuild. Если значение ToolsVersion не определено, MSBuild продолжает использовать прежний путь к набору инструментов, исходя из предположения, что проект является проектом Visual Studio 2005.

      Если существующий проект Visual Studio 2005 открыть в Visual Studio 2008, он физически "обновляется" за счет включения назначения "ToolsVersion=3.5", поскольку Visual Studio 2008 поддерживает только построение с помощью набора инструментов версии 3.5. В результате, когда проект создается в Visual Studio 2008, в нем используется набор инструментов Visual Studio 2008 (3.5) вместо набора инструментов Visual Studio (2.0).

      Проекты, созданные с помощью набора инструментов версии 2.0, могут предназначаться для .NET Framework 2.0, а проекты, созданные с помощью набора инструментов версии 3.5 — для .NET Framework версии 2.0, 3.0 или 3.5. Даже в том случае, если была выполнена миграция проекта Visual Studio в Visual Studio 2008 и обновление для использования набора инструментов версии 3.5, требуемой версией .NET Framework для проекта останется .NET Framework 2.0. Этим гарантируется, что в случае выполнения миграции проекта в Visual Studio 2008 не появятся новые зависимости. Построение проекта выполняется в точности так, как для Visual Studio.

    И еще информация по использованию Project.ToolsVersion и Project.DefaultToolsVersion:

    http://msdn.microsoft.com/ru-ru/library/microsoft.build.buildengine.project.toolsversion.aspx

    http://msdn.microsoft.com/ru-ru/library/microsoft.build.buildengine.project.defaulttoolsversion.aspx

    Эта статья не отвечает на мой последний вопрос. Единственное предположение что в VS 2008 и VS 2012 при одинаковом ToolsVersion = "2.0" переменные $(MSBuildToolsPath) (или $(MSBuildBinPath))   выдают разный результат. Это я попробую выяснить опытным путем завтра. О результате отпишусь.
    13 февраля 2013 г. 18:01
  • Автоматически реализуемые свойства появились в c# начиная с 3й версии фреймворка.
    14 февраля 2013 г. 4:16
    Модератор