12

Tworzę multy framework project. Używam czegoś takiego:Jak ustawić .NET Core w instrukcji #if do kompilacji

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

Ale nie mogę znaleźć wieloznacznika dla .NET Core. Próbowałem:

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

, ale nie jest to prawidłowe oświadczenie. Dzięki.

+3

Zmień, aby '#if NETCOREAPP1_0' –

+0

Tak, wymienić '.' z' _' – MartinHN

+0

@KiranChalla Myślę, że powinieneś opublikować to jako odpowiedź. – svick

Odpowiedz

22

Zastosowanie NETCOREAPP1_0 lub więcej Resent NETCOREAPP1_1 i NETCOREAPP2_0

Wyrób https://docs.microsoft.com/en-us/dotnet/articles/core/tutorials/libraries zawiera listę dla różnych symboli preprocesora.

.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 standardowe 1,0 -> NETSTANDARD1_0

NET standardowe 1,1 -> NETSTANDARD1_1

NET standardowe 1,2 -> NETSTANDARD1_2

NET standardowe 1,3 -> NETSTANDARD1_3

. Standardowe NET 1.4 -> NETSTANDARD1_4

NET Standardowy 1,5 -> NETSTANDARD1_5

Standardowy .NET 1.6 -> NETSTANDARD1_6

9

Można definiować żadnych niestandardowych warunkowe symbole kompilację w następujący sposób (project.json):

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

    } 
} 

Takie podejście wydaje się być bardziej praktyczne, ponieważ mogą używać tego samego symbolu warunkową dla kilku celów, bez konieczności napisać coś podobnego

#if NET20 && NET 40 && NET45 
2

Podczas gdy odpowiedź powyżej ten jest prawidłowy, należy zauważyć, że jest to błąd w .NET Typ projektu Core xproj. Po zdefiniowaniu warunkowego symbolu kompilacji w ustawieniach projektu, definiuje on element jako "definiuje", ale jest to niepoprawne. Powinien utworzyć element o nazwie "zdefiniuj".Możesz obejść ten problem, edytując ręcznie project.json.

Zalogowałem ten błąd w firmie Microsoft w dwóch miejscach. Poświęć trochę czasu, aby zarejestrować swoją irytację w firmie Microsoft, aby w końcu rozwiązać problem i nie wywoływać tego żalu dla innych.

Ten wątek ma szczegółowe wyjaśnienie problemu z kroków do repro i screeny: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946

Jest to raport o błędzie Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs

2

Dla nowego systemu Visual Studio 2017 projektu csproj .. .

można znaleźć pełną listę dostępnych symboli tutaj: https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

można utworzyć kompozytowy c Sta ła (y) w pliku .csproj tak:

<PropertyGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net461' "> 
    <DefineConstants>FULLFRAMEWORK;FULL</DefineConstants> 
    </PropertyGroup> 

Wtedy można go używać w dyrektywie #if kompilator tak:

#if FULLFRAMEWORK 
     private bool DoSomethingFullFrameworkSpecific() 
     { 
      var connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionStringName]; 
      return connectionStringSetting != null; 
     } 
#endif 
Powiązane problemy