Como escribió Jon Skeet, no hay una forma evidente de definir el marco de destino en el nivel de la solución. Sin embargo, esto se puede hacer agregando configuraciones específicas de a la solución, luego editando los archivos *.csproj
manualmente para especificar los objetivos para cada configuración, en lugar de globalmente para todo el proyecto.
Aquí es una guía paso a paso:
- Seleccionar Construir - Administrador de configuración.
- En la lista desplegable Configuración de soluciones activas , seleccione y escriba un nombre descriptivo (por ejemplo,
Debug v3.5
) basadas en la configuración existente que ya tiene.
- Para cada archivo de proyecto, abrirlo en el editor (se puede hacer esto en Visual Studio, pero hay que primero haga clic en él en el Explorador de soluciones y seleccione Unload Proyecto, entonces Editar xyz.csproj)
- Busque el elemento
<PropertyGroup>
que coincida con la configuración que acaba de crear (por ejemplo Debug v3.5|AnyCPU
).
- Agregue el XML, por ejemplo, después del elemento de cierre
</PlatformTarget>
, <TargetFrameworkVersion>
y <TargetFrameworkProfile>
que necesita.
- Guarde el archivo.
- En el Explorador de soluciones, use el comando Recargue el proyecto para que el proyecto vuelva a estar disponible.
Este es un ejemplo:
<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>
Nota que también definen el símbolo DOTNET35
, lo que me permite escribir dependientes #if
declaraciones del marco en el código fuente. Tenía, por ejemplo, algunas piezas de código que se basaban en System.Tuple
y al agregar una versión minimalista de la clase, podía realizar una copia de seguridad de mi aplicación .NET 4.0 en .NET 3.5.
Aquí es mi fragmento:
#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
+1: Gran respuesta. Me ayudó muchísimo. A propósito, también tenía algunos códigos que se basaban en 'System.Tuple'. –
VS 2012 no parece muy contento con esto – leonbloy