[英]How to set .NET Core in #if statement for compilation
我創建了一個多目標框架項目。 我使用這樣的東西:
#if NET40
Console.WriteLine("Hello from .NET Core 4");
#endif
但是我找不到 .NET Core 的通配符。 我試過:
#if NETCOREAPP1.0
Console.WriteLine("Hello from .NET Core");
#endif
但它不是有效的聲明。
您需要一個下划線_
,而不是一個點:
NETCOREAPP1_0
或更新的NETCOREAPP1_1
和NETCOREAPP2_0
使用跨平台工具開發庫一文包含不同預處理器符號的列表。
.NET 框架 2.0:NET20
.NET 框架 3.5:NET35
.NET 框架 4.0:NET40
.NET 框架 4.5 --> NET45
.NET 框架 4.5.1 --> NET451
.NET 框架 4.5.2 --> NET452
.NET 框架 4.6 --> NET46
.NET 框架 4.6.1 --> NET461
.NET 框架 4.6.2 --> NET462
.NET 框架 4.7.0 --> NET47
.NET 框架 4.7.1 --> NET471
.NET 框架 4.7.2 --> NET472
.NET 標准任意 --> NETSTANDARD
.NET 標准 1.0 --> NETSTANDARD1_0
.NET 標准 1.1 --> NETSTANDARD1_1
.NET 標准 1.2 --> NETSTANDARD1_2
.NET 標准 1.3 --> NETSTANDARD1_3
.NET 標准 1.4 --> NETSTANDARD1_4
.NET 標准 1.5 --> NETSTANDARD1_5
.NET 標准 1.6 --> NETSTANDARD1_6
.NET 標准 2.0 --> NETSTANDARD2_0
.NET 標准 2.1 --> NETSTANDARD2_1
Devon對 Visual Studio 2017 .csproj 文件的回答的擴展:
查看此處的表格,您可以使用正則表達式輕松定義常量。 因此,如果添加/更改目標框架,您無需考慮更新條件。
<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>
用法:
#if NETFRAMEWORK
FrameworkSpecific();
#endif
#if NETSTANDARD
StandardSpecific();
#endif
#if NETCORE
CoreSpecific();
#endif
您可以通過以下方式 (project.json) 定義任何自定義條件編譯符號:
"frameworks": {
"net40": {
"buildOptions": {
"define": ["NET_40"]
}
},
"netstandard1.5": {
"buildOptions": {
"define": [ "NET_STANDARD" ]
}
}
}
這種方法似乎更實用,因為您可以對多個目標使用相同的條件符號,而無需編寫類似
#if NET20 && NET 40 && NET45
對於新的 Visual Studio 2017 .csproj 項目系統,您可以在使用跨平台工具開發庫,如何多目標中找到可用符號的完整列表。
您可以在 .csproj 文件中為它創建復合常量,如下所示:
<PropertyGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net461' ">
<DefineConstants>FULLFRAMEWORK;FULL</DefineConstants>
</PropertyGroup>
然后你可以在#if
編譯器指令中使用它,如下所示:
#if FULLFRAMEWORK
private bool DoSomethingFullFrameworkSpecific()
{
var connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionStringName];
return connectionStringSetting != null;
}
#endif
雖然Vitaliy Fedorchenko 的回答是正確的,但應注意 .NET Core xproj 項目類型中存在錯誤。 當您通過項目設置定義條件編譯符號時,它將元素定義為“定義”,但這是不正確的。 它應該創建一個名為“define”的元素。 您可以通過手動編輯 project.json 文件來解決此問題。
我已經在兩個地方與微軟記錄了這個錯誤。 請花點時間向 Microsoft 報告您的煩惱,以便他們最終能夠解決問題,而不會給其他人帶來這種痛苦。
該線程對問題的詳細說明以及重現步驟和屏幕截圖:
NET Core Visual Studio 項目的 3 個問題 #4022
這是 Microsoft Connect 錯誤報告:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.