2016-07-20 62 views
12

我創建了multy框架項目。我使用這樣的事情:如何在編譯#if語句中設置.NET Core

#if NET40 
    Console.WriteLine("hello from net 4"); 
    #endif 

但我找不到通配符的.NET核心。我試過了:

#if NETCOREAPP1.0 
    Console.WriteLine("hello from net Core"); 
    #endif 

但它是無效聲明。 謝謝。

+3

更改到'#如果NETCOREAPP1_0' –

+0

是,更換'.'帶'_' – MartinHN

+0

@KiranChalla我認爲你應該將其作爲答案。 – svick

回答

22

使用NETCOREAPP1_0以上怨恨NETCOREAPP1_1NETCOREAPP2_0

文章https://docs.microsoft.com/en-us/dotnet/articles/core/tutorials/libraries包括不同的預處理符號列表。

的.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框架4.6 - > NET46

.NET框架4.6.1 - > NET461

.NET框架4.6.2 - > NET462

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

9

您可以定義下列方式的任何自定義條件編譯符號(project.json):這種做法似乎是,因爲你可能更實際

"frameworks": { 
    "net40": { 
     "buildOptions": { 
     "define": ["NET_40"] 
     } 
    }, 
    "netstandard1.5": { 
     "buildOptions": { 
     "define": [ "NET_STANDARD" ] 
     } 

    } 
} 

使用多個目標相同情況的符號,而不需要寫類似

#if NET20 && NET 40 && NET45 
2

雖然上述這一個答案是正確的,但應注意的是,在.NET中的錯誤Core xproj項目類型。通過項目設置定義條件編譯符號時,它將該元素定義爲「定義」,但這是不正確的。它應該創建一個名爲「define」的元素。您可以通過手動編輯project.json來解決該問題。

我在兩處記錄了微軟的這個錯誤。請花點時間向微軟註冊您的煩惱,以便他們最終能夠解決問題並且不會爲他人造成這種悲傷。

這個討論有問題的有步驟的攝製,和截圖的詳細解釋:https://github.com/dotnet/cli/issues/4022#issuecomment-238777946

這是微軟連接錯誤報告:https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs

2

對於新的Visual Studio 2017年的csproj項目系統.. 。

你可以在這裏找到可用符號的完整列表: https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

您可以創建合成的C- onstant(個),在.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