2016-06-26 19 views
6

Ich habe eine .Net Core R2-Klassenbibliothek erstellt, die einen gemeinsamen Code enthält, den ich für verschiedene Plattformen verwende. Ein Teil des Codes ist in der .NET Core-Plattform nicht gültig. Daher möchte ich ein bedingtes Kompilierungssymbol umschließen. Ich suchte zuerst im Internet nach einem integrierten Symbol (wie SILVERLIGHT für Silverlight-Apps und WINFX_CORE für Windows 8-Apps), konnte jedoch keine Informationen finden und entschloss mich, ein eigenes Symbol zu erstellen. Das scheint auch nicht zu funktionieren.Bedingtes Kompilierungssymbol für .NET-Kernklassenbibliothek

Von allem, was ich lese, Hinzufügen und Verwenden eines Symbols sollte einfach sein, fügen Sie einfach einen Wert zu den Conditional Compilation Symbole in den Projekteigenschaften | Registerkarte erstellen Ich habe das getan, aber es scheint zu funktionieren. Hier sind ein paar Screenshots ...

enter image description here

enter image description here

Beachten Sie, dass ich einen NET_CORE Wert in dem Conditional Compilation Symbol hinzugefügt, aber wenn ich es im Code verwenden wird der Code nicht außer Acht gelassen werden.

1) Weiß jemand, ob es ein eingebautes Symbol für die .Net Core-Plattform gibt (ich verwende R2)?

2) Wenn es keinen gibt, was mache ich falsch, wenn ich mein eigenes Symbol erstelle?

Die .xproj Datei:

<?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: Ich konnte dies den Link in der vorgesehenen Antwort mit lösen. Hier sind die Details ...

Ursprünglich war die project.json Datei so aussah ...

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

ich das Problem gelöst, indem sie diese zu ändern ...

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

die bedingte Kompilierung Symbol kann begrenzt werden zu einer bestimmten Build-Konfiguration/Plattform. Überprüfen Sie den Konfigurationsmanager und erstellen Sie die Eigenschaften "(Alle Konfigurationen/Plattformen)" – dlatikay

+0

Mögliches Duplikat von [Festlegen von .NET Core in der #if-Anweisung für die Kompilierung] (http://stackoverflow.com/questions/38476796/how-to- set-net-core-in-if-Anweisung zur Kompilierung –

Antwort

2

Es ist ein Fehler in dem Projekttyp xproj .NET-Core. Wenn Sie ein bedingtes Kompilierungssymbol über die Projekteinstellungen definieren, definiert es das Element als "definiert", aber das ist falsch. Es sollte ein Element namens "define" erstellt werden. Sie können das Problem umgehen, indem Sie die Datei project.json manuell bearbeiten.

Ich habe diesen Fehler mit Microsoft an zwei Stellen protokolliert. Bitte nehmen Sie sich die Zeit, um Ihren Ärger mit Microsoft zu registrieren, damit sie schließlich damit fertig werden, das Problem zu beheben und diesen Kummer nicht für andere zu verursachen.

diese Diskussion gibt es eine detaillierte Beschreibung des Problems mit den Schritten Repro und Screenshots: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946

Dies ist der Microsoft Connect Bug-Report: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs

4

Seit xproj eingestellt wurde, ist hier, wie es ist in der neuen VS 2017 csproj getan.

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

Dann statt:

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

Sie tun können:

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

Sehen Sie hier, um weitere Informationen zu Multi-Targeting: https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget