2016-06-26 36 views
6

Ho creato una libreria di classi .NET Nucleo R2 avere qualche codice comune che uso per diverse piattaforme. Parte del codice non è valida nella piattaforma .Net Core e quindi desidero avvolgerlo attorno a un simbolo di compilazione condizionale. Ho cercato in internet per vedere se riuscivo a trovare un simbolo built-in (come Silverlight per applicazioni Silverlight e WINFX_CORE per Windows 8 le app), ma non sono riuscito a trovare tutte le informazioni così ho deciso di creare il mio proprio simbolo. Anche questo non sembra funzionare.Compilazione Condizionale simbolo per Net Nucleo Class Library

Da tutto quello che ho letto l'aggiunta e l'utilizzo di un simbolo dovrebbe essere facile, basta aggiungere un valore ai simboli di compilazione condizionale nelle proprietà del progetto | Scheda Build. L'ho fatto ma sembra funzionare. Qui ci sono uno schermo paio di colpi ...

enter image description here

enter image description here

Si noti che ho aggiunto un valore NET_CORE nel simbolo compilazione condizionale, ma quando lo uso nel codice il codice non viene ignorato.

1) Qualcuno sa se esiste un simbolo integrato per la piattaforma .Net Core (sto usando R2)?

2) Se non c'è uno, quello che sto facendo di sbagliato creare il mio simbolo?

Il file .xproj:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion> 
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> 
    </PropertyGroup> 
    <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" /> 
    <PropertyGroup Label="Globals"> 
    <ProjectGuid>253184d7-9b42-4233-a871-8cfa3ee9e83e</ProjectGuid> 
    <RootNamespace>Linq2Db.NetCore</RootNamespace> 
    <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath> 
    <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath> 
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> 
    <SccProjectName>SAK</SccProjectName> 
    <SccProvider>SAK</SccProvider> 
    <SccAuxPath>SAK</SccAuxPath> 
    <SccLocalPath>SAK</SccLocalPath> 
    </PropertyGroup> 
    <PropertyGroup> 
    <SchemaVersion>2.0</SchemaVersion> 
    </PropertyGroup> 
    <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" /> 
</Project> 



UPDATE: ero in grado di risolvere questo utilizzando il link nella risposta fornita. Ecco i dettagli ...

Originariamente il file project.json si presentava così ...

{ 
    "dependencies": { 
     "NETStandard.Library": "1.5.0-rc2-24027" 
    }, 
    "frameworks": { 
    "netstandard1.5": { 
     "imports": "dnxcore50" 
    } 
    }, 
    "buildOptions": { 
    "defines": [ "NET_CORE" ] 
    } 
} 

Ho risolto il problema modificando a questo ...

{ 
    "frameworks": { 
    "netstandard1.5": { 
     "imports": "dnxcore50", 
     "dependencies": { 
     "NETStandard.Library": "1.5.0-rc2-24027" 
     }, 
     "buildOptions": { 
     "define": [ "NET_CORE" ] 
     } 
    } 
    } 
} 
+0

il simbolo compilazione condizionale potrebbe essere limitata a una determinata configurazione/piattaforma di build. Ispeziona il Configuration Manager e costruisci le proprietà "(Tutte le configurazioni/piattaforme)" – dlatikay

+0

Possibile duplicato di [Come impostare .NET Core nell'istruzione #if per la compilazione] (http://stackoverflow.com/questions/38476796/how-to- set-net-core-in-se-dichiarazione-per-compilazione) –

risposta

2

C'è un bug in .NET Nucleo xproj tipo di progetto. Quando si definisce un simbolo compilazione condizionale tramite le impostazioni del progetto, definisce l'elemento come "definisce", ma questo non è corretto. Dovrebbe creare un elemento chiamato "define". È possibile aggirare il problema modificando manualmente project.json.

Ho registrato questo errore con Microsoft in due posti. Si prega di prendere il tempo di registrare il fastidio con Microsoft in modo che alla fine andare in giro a risolverlo e non causando questo dolore per gli altri.

questa discussione c'è una spiegazione dettagliata del problema con gradini a Repro, e screenshot: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946

Questo è il bug report Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs

4

Dal xproj è stato interrotto, ecco come è fatto nel nuovo csproj VS 2017.

<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.3' Or '$(TargetFramework)' == 'netstandard1.6' "> 
    <DefineConstants>NET_CORE</DefineConstants> 
</PropertyGroup> 

Allora, invece di:

private TypeInfo GetTypeInfo(Type type) 
{ 
#if NETSTANDARD1_3 || NETSTANDARD1_6 
     //core 
#else 
     //fullframework 
#endif 
} 

Si può fare:

private TypeInfo GetTypeInfo(Type type) 
{ 
#if NET_CORE 
     //core 
#else 
     //fullframework 
#endif 
} 

Vedi qui per maggiori dettagli su multi-targeting: https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

Problemi correlati