Целевая версия .NET Framework на уровне решения Visual Studio 2010 - PullRequest
8 голосов
/ 13 декабря 2010

Я хотел бы настроить таргетинг на .NET 3.5 и .NET 4.0 в своем решении Visual Studio 2010.

Я знаю, что могу установить <TargetFrameworkVersion /> в файлах моего проекта, однако это требует от меняотредактируйте каждый файл проекта, прежде чем создавать решение для конкретной версии .NET Framework.Скотт Дорман (Scott Dorman) предоставляет макрос, который помогает в его сообщении в блоге Visual Studio 2010 и версия Target Framework .

Я ищу глобальное решение, в котором мне не нужно менять настройкив каждом проекте.Можно ли изменить центральную настройку на уровне решения, чтобы добиться того же самого?

Ответы [ 2 ]

18 голосов
/ 13 декабря 2010

Как писал Джон Скит, не существует очевидного способа определения целевой структуры на уровне решения.Однако это можно сделать, добавив к решению конкретные конфигурации , а затем отредактировав файлы *.csproj вручную, указав цели для каждой конфигурации, а не глобально для всего проекта.

Вот пошаговое руководство:

  1. Выбрать Сборка - Диспетчер конфигурации .
  2. В Активное решениеконфигурации , в раскрывающемся списке выберите и введите осмысленное имя (например, Debug v3.5) в зависимости от существующих настроек.
  3. Для каждого файла проекта откройте его вредактор (вы можете сделать это в Visual Studio, но вы должны сначала щелкнуть по нему правой кнопкой мыши в обозревателе решений и выбрать Выгрузить проект , затем Редактировать xyz.csproj ).
  4. Найдите элемент <PropertyGroup>, который соответствует конфигурации, которую вы только что создали (например, Debug v3.5|AnyCPU).
  5. Добавьте в XML, например, после закрывающего элемента </PlatformTarget>, <TargetFrameworkVersion> и <TargetFrameworkProfile> вам нужно.
  6. Save файл.
  7. В обозревателе решений введите команду Обновить проект , чтобы снова сделать проект доступным.

Вот пример:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug v3.5|AnyCPU'">
  <DebugSymbols>true</DebugSymbols>
  <OutputPath>bin\Debug v3.5\</OutputPath>
  <DefineConstants>DEBUG;TRACE;DOTNET35</DefineConstants>
  ...
  <DebugType>full</DebugType>
  <PlatformTarget>x86</PlatformTarget>
  <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  <TargetFrameworkProfile>Client</TargetFrameworkProfile>
  ...
</PropertyGroup>

Обратите внимание, что я также определяю символ DOTNET35, который позволяет мне писать зависящие от каркаса операторы #if в исходном коде.У меня было, например, несколько кусков кода, которые опирались на System.Tuple, и, добавив минималистичную версию класса, я мог бы перенести свое приложение .NET 4.0 обратно в .NET 3.5.

Вотмой фрагмент:

#if DOTNET35
namespace System
{
    public class Tuple<T1, T2>
    {
        public Tuple(T1 item1, T2 item2)
        {
            this.item1 = item1;
            this.item2 = item2;
        }

        public T1 Item1
        {
            get
            {
                return this.item1;
            }
        }

        public T2 Item2
        {
            get
            {
                return this.item2;
            }
        }

        private readonly T1 item1;
        private readonly T2 item2;
    }
}
#endif
6 голосов
/ 13 декабря 2010

Не то, чтобы я знал.

Обратите внимание, что проект может быть частью нескольких решений - или может быть построен независимо от любого решения.Таким образом, все, что действительно мог бы сделать параметр «уровень решения», - это установить значение по умолчанию при создании нового проекта.

Если вы отредактируете файлы проекта вручную, я считаю, вы сможетесоздать единый файл проекта с конфигурациями для .NET 3.5 и .NET 4. (Я, конечно, делал это раньше для .NET 2 и .NET 3.5.) Тогда вы могли бы иметь различные конфигурации уровня решения, которые нацелены на соответствующий проект.многоуровневые конфигурации.

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