簡體   English   中英

如何在#if 語句中設置.NET Core 進行編譯

[英]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_1NETCOREAPP2_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 錯誤報告:

https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM