tag - update c# visual studio
Cómo configurar.NET Core en la instrucción#if para compilación (5)
Creo proyecto multy framework. Yo uso algo como esto:
#if NET40
Console.WriteLine("hello from net 4");
#endif
Pero no puedo encontrar comodines para .NET Core. Lo intenté :
#if NETCOREAPP1.0
Console.WriteLine("hello from net Core");
#endif
Pero no es una declaración válida. Gracias.
Extensión de la respuesta de Devon para los archivos .csproj de VS2017:
Mirando la tabla here , puede definir fácilmente las constantes usando expresiones regulares. Por lo tanto, no necesita pensar en actualizar las condiciones si se agregan / cambian los marcos de destino.
<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(''$(TargetFramework)'', ''^net/d''))">
<DefineConstants>NETFRAMEWORK</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(''$(TargetFramework)'', ''^netstandard/d''))">
<DefineConstants>NETSTANDARD</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(''$(TargetFramework)'', ''^netcoreapp/d''))">
<DefineConstants>NETCORE</DefineConstants>
</PropertyGroup>
Uso:
#if NETFRAMEWORK
FrameworkSpecific();
#endif
#if NETSTANDARD
StandardSpecific();
#endif
#if NETCORE
CoreSpecific();
#endif
Necesita subrayar _
lugar de un punto:
NETCOREAPP1_0
o el NETCOREAPP1_0
más reciente y NETCOREAPP2_0
El artículo https://docs.microsoft.com/en-us/dotnet/articles/core/tutorials/libraries incluye una lista de los diferentes símbolos del preprocesador.
.NET Framework 2.0: NET20
.NET Framework 3.5: NET35
.NET Framework 4.0: NET40
.NET Framework 4.5 -> NET45
.NET Framework 4.5.1 -> NET451
.NET Framework 4.5.2 -> NET452
.NET Framework 4.6 -> NET46
.NET Framework 4.6.1 -> NET461
.NET Framework 4.6.2 -> NET462
. NET Standard 1.0 -> NETSTANDARD1_0
.NET Standard 1.1 -> NETSTANDARD1_1
.NET Standard 1.2 -> NETSTANDARD1_2
.NET Standard 1.3 -> NETSTANDARD1_3
.NET Standard 1.4 -> NETSTANDARD1_4
.NET Standard 1.5 -> NETSTANDARD1_5
.NET Standard 1.6 -> NETSTANDARD1_6
Para el nuevo sistema de proyectos csproj de Visual Studio 2017 ...
Puede encontrar la lista completa de los símbolos disponibles aquí: https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget
Puede crear constantes compuestas para su archivo .csproj así:
<PropertyGroup Condition="''$(TargetFramework)'' == ''net451'' Or ''$(TargetFramework)'' == ''net461'' ">
<DefineConstants>FULLFRAMEWORK;FULL</DefineConstants>
</PropertyGroup>
Entonces puedes usarlo en una directiva de compilación #if
así:
#if FULLFRAMEWORK
private bool DoSomethingFullFrameworkSpecific()
{
var connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionStringName];
return connectionStringSetting != null;
}
#endif
Puede definir cualquier símbolo de compilación condicional personalizado de la siguiente manera (project.json):
"frameworks": {
"net40": {
"buildOptions": {
"define": ["NET_40"]
}
},
"netstandard1.5": {
"buildOptions": {
"define": [ "NET_STANDARD" ]
}
}
}
Este enfoque parece ser más práctico porque puede usar el mismo símbolo condicional para varios objetivos, sin necesidad de escribir algo como
#if NET20 && NET 40 && NET45
Si bien la respuesta anterior es correcta, se debe tener en cuenta que existe un error en el tipo de proyecto .NET Core xproj. Cuando define un símbolo de compilación condicional a través de la configuración del proyecto, define el elemento como "define", pero esto es incorrecto. Debe crear un elemento llamado "definir". Puede solucionar el problema editando el project.json manualmente.
He registrado este error con Microsoft en dos lugares. Por favor, tómese el tiempo para registrar su molestia con Microsoft para que finalmente logren solucionarla y no causen este dolor a los demás.
Este hilo tiene una explicación detallada del problema con los pasos para la reproducción y las capturas de pantalla: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946
Este es el informe de error de Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs