在Visual Studio 2010解决方案级别定位.NET框架的特定版本

Pie*_*aud 8 .net visual-studio-2010

我想在我的Visual Studio 2010解决方案中同时针对.NET 3.5和.NET 4.0.

我知道我可以<TargetFrameworkVersion />在我的项目文件中设置,但是这需要我在构建特定.NET框架版本的解决方案之前编辑每个项目文件.Scott Dorman提供了一个宏,可以在他的博客Visual Studio 2010和Target Framework Version上发挥作用.

我正在寻找一个全局解决方案,我不必在每个项目中更改设置.是否可以在解决方案级别更改中央设置以实现相同的目标?

Pie*_*aud 18

正如Jon Skeet所写,没有明显的方法可以在解决方案级别定义目标框架.但是,这可以通过向解决方案添加特定配置,然后*.csproj手动编辑文件以指定每个配置的目标,而不是整个项目的全局配置来完成.

这是一个循序渐进的指南:

  1. 选择Build - Configuration Manager.
  2. 在" 活动解决方案配置"下拉列表中,选择Debug v3.5根据您已有的任何现有设置输入有意义的名称(例如).
  3. 对于每个项目文件,在编辑器中打开它(您可以在Visual Studio中执行此操作,但必须先在解决方案资源管理器中右键单击它,然后选择" 卸载项目",然后选择" 编辑xyz.csproj").
  4. 找到<PropertyGroup>与刚刚创建的配置匹配的元素(例如Debug v3.5|AnyCPU).
  5. 添加在XML,例如闭幕后</PlatformTarget>元素的<TargetFrameworkVersion><TargetFrameworkProfile>你所需要的.
  6. 保存文件.
  7. 在Solution Explorer中,使用命令Reload Project使项目再次可用.

这是一个示例:

<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>
Run Code Online (Sandbox Code Playgroud)

请注意,我还定义了符号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
Run Code Online (Sandbox Code Playgroud)

  • VS 2012对此并不高兴 (2认同)

Jon*_*eet 6

不是我知道的.

请注意,项目可以是多个解决方案的一部分 - 或者可以独立于任何解决方案构建.因此,所有"解决方案级别"选项实际上都可以在创建新项目时设置默认值.

如果你手工编辑项目文件,我相信你应该能够创建一个包含.NET 3.5和.NET 4配置的项目文件.(我现在肯定已经为.NET 2和.NET 3.5做过了.) )然后,您可以使用针对相关项目级配置的不同解决方案级别配置.