2016-06-26 3 views
6

Я создал библиотеку классов .Net Core R2, имеющую некоторый общий код, который я использую для нескольких разных платформ. Некоторые из кода недействительны на платформе .Net Core, поэтому я хочу обернуть его вокруг условного символа компиляции. Сначала я искал в Интернете, чтобы узнать, могу ли я найти встроенный символ (например, SILVERLIGHT для приложений Silverlight и WINFX_CORE для Windows 8), но не смог найти какую-либо информацию, поэтому решил создать свой собственный символ. Это тоже не работает.Условный символ компиляции для библиотеки .Net Core Class

Из всего, что я прочитал, добавление и использование символа должно быть простым, просто добавьте значение в символы условной компиляции в свойствах проекта | Построить вкладку. Я сделал это, но он работает. Вот несколько снимков экрана ...

enter image description here

enter image description here

Обратите внимание, что я добавил значение NET_CORE в условной компиляции символ, но когда я использую его в коде код не игнорируется.

1) Кто-нибудь знает, есть ли встроенный символ для платформы .Net Core (я использую R2)?

2) Если нет, то что я делаю неправильно, создавая свой собственный символ?

.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: я был в состоянии решить эту проблему с помощью ссылки в поставленном ответ. Вот подробности ...

Первоначально файл project.json выглядел так ...

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

Я решил проблему, изменив его на это ...

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

символ условной компиляции может быть ограничено к определенной конфигурации/платформе сборки. Проверьте конфигурационный менеджер и свойства сборки "(Все конфигурации/платформы)" – dlatikay

+0

Возможный дубликат [Как установить .NET Core в инструкции #if для компиляции] (http://stackoverflow.com/questions/38476796/how-to- нетто-ядро-в-зор-Условный оператор-для-компиляции) –

ответ

2

Существует ошибка в .NET Core xproj типа проекта. Когда вы определяете условный символ компиляции через настройки проекта, он определяет элемент как «определяет», но это неверно. Он должен создать элемент, называемый «define». Вы можете обойти эту проблему, отредактировав файл project.json вручную.

Я зарегистрировал эту ошибку с Microsoft в двух местах. Пожалуйста, найдите время, чтобы зарегистрировать свое раздражение у Microsoft, чтобы они в конце концов смогли его исправить и не причинить этому горе другим.

Эта нить имеет подробное объяснение проблемы с шагом в REPRO и скриншоты: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946

Это отчет об ошибке Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs

4

С xproj было прекращено, вот как это выполняется в новом VS 2017 csproj.

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

Тогда вместо:

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

Вы можете сделать:

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

Смотрите здесь для более подробной информации о мульти-таргетинга: https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

 Смежные вопросы

  • Нет связанных вопросов^_^