Совместимость пакета Nuget для .NET Core и .NET Framework 4.6

Я создал пакет nuget, который поддерживает как .NET framework, так и ядро ​​.net. Но один класс в нем имеет ссылки, доступные только для ядра .net. Мне не нужно, чтобы этот класс был доступен во фреймворке .net

Есть ли какой-либо атрибут или способ, который исключает этот класс при создании пакета для .net framweork?

Вот как я ориентируюсь на фреймворки

<TargetFrameworks>netcoreapp2.0;netstandard2.0;net45;net46</TargetFrameworks>

person Amna    schedule 13.04.2018    source источник
comment
Кстати, вам обязательно нужно настроить таргетинг на net45 и net46 по-разному? То же самое с netcoreapp2.0 и netstandard2.0? Если вы нацеливаетесь на net45, пакет в любом случае будет работать с net46 - аналогично, если вы нацеливаетесь на netstandard2.0, пакет будет работать с netcoreapp2.0. Обычно вам нужно настроить таргетинг на все из них, если вы хотите использовать особенности, специфичные для net46 или netcoreapp2.0.   -  person Jon Skeet    schedule 13.04.2018
comment
Скриншот наверное стоит сейчас удалить, так как он уже не актуален.   -  person Jon Skeet    schedule 13.04.2018


Ответы (1)


Просто используйте символы условной компиляции, которые будут автоматически поставляться для каждой цели. Например:

// Put this at the start of the file (if you want some of the file to still be built)
// or class (if you just want to exclude a single class). You could even
// exclude just a single method, or part of a method.
#if NETCOREAPP2_0 || NETSTANDARD2_0

public class NetFrameworkOnlyClass
{
}

// And this at the end
#endif

Или вместо включения вы можете исключить следующим образом:

#if !NET45 && !NET46

Список условной компиляции см. В руководстве по кроссплатформенной библиотеке символы, определенные в каждой среде. (Я думаю, было бы неплохо иметь нейтральные к версии символы «NETCORE», «NETSTANDARD» и «NETFULL» или аналогичные, но я не верю, что они существуют. Вы можете указать их в своем файле проекта, если хотите.)

person Jon Skeet    schedule 13.04.2018
comment
Дейзи, после того, как вы добавили свой путь, пожалуйста, посмотрите прикрепленное изображение на скриншоте моего вопроса. По-прежнему появляется ошибка сборки - person Amna; 13.04.2018
comment
@Diana: Вы поместили его после директив using, что означает, что он не будет работать, если эти пространства имен недоступны. Переместите его вправо в начало файла, предполагая, что вам ничего не нужно в файле для netstandard / netcore. - person Jon Skeet; 13.04.2018
comment
@Diana: Хотя сообщения об ошибках предполагают, что, возможно, у вас просто нет зависимости от правильного пакета для конфигурации и расширений конфигурации. У вас есть ссылка на пакет Microsoft.Configuration.Extensions? - person Jon Skeet; 13.04.2018
comment
Вам также необходимо добавить символы условной компиляции для оператора using. См. В качестве примера LogContext в serilog: - person Feiyu Zhou; 13.04.2018
comment
Дейзи спасибо. Это сработало. Я отметил ваш ответ как хорошее решение :) - person Amna; 13.04.2018
comment
@FeiyuZhou: На самом деле я не думаю, что здесь проблема - внимательно посмотрев на скриншот, я подозреваю, что у Дианы нет правильных ссылок на пакеты для конфигурации. Но, безусловно, разумно переместить директиву препроцессора прямо в начало файла. - person Jon Skeet; 13.04.2018
comment
@DaisyShipton, Microsoft.Extensions.Configuration не для net45 и net46, это зависит от netstand2.0 - person Feiyu Zhou; 13.04.2018
comment
@FeiyuZhou: Ага, я неправильно истолковал вопрос. Буду редактировать условия. Это все объясняет ... - person Jon Skeet; 13.04.2018