2016-12-31 2 views
4

У меня есть small library, который в настоящее время поддерживает .NET 2.0+.Как создать библиотеку, предназначенную для .NET 2.0 и .NET Standard?

Я не использую никаких функций более поздних версий фреймворка, поэтому было бы неплохо поддерживать поддержку 2.0, но я также хочу настроить .NET Core (или, точнее, .NET Standard).

Я пытался добавить обе рамки для project.json:

"frameworks": { 
    "net20": {}, 
    "netstandard1.6": { 
    "imports": "dnxcore50" 
    } 
} 

Но NuGet пакеты моя библиотека должна работать на .NET Standard (System.Reflection и Microsoft.AspNetCore.WebUtilities) не совместимы с .NET 2.0.

Как я могу решить эту проблему без сохранения двух полностью отдельных проектов с почти идентичным кодом?

+0

Вопрос в том, зачем нужна поддержка .NET Framework 2.0, если вы хотите использовать пакет с минимальным требованием 4.5.1/netstandard 1.3 (= .NET Framework 4.6)? Вы хотите использовать его с устаревшим ASP.NET 4? Если нет, нет причин для таргетинга на этот низкий уровень, если он зависит от ASP.NET Core, поскольку ядро ​​ASP.NET не будет работать ни на чем ниже 4.5 или 4.5.1 – Tseng

ответ

4

Вы не можете, если вы зависите от Microsoft.AspNetCore.* пакетов как абсолютный минимум для поддержки .NET Standard .NET 4.5.

.NET 4.5 - первая версия, включающая System.Runtime, на которой основан .NET Core. Но когда вы думаете об этом ближе, это тоже бессмысленно. Если вам нужна поддержка ASP.NET Core в вашей библиотеке.

Если ваша библиотека должна запускаться для ASP.NET Core и ASP.NET 4 (т. Е. MVC 5, WebApi 2), тогда вам необходимо будет использовать зависимостей ASP.NET условно и использовать директивы препроцессора #if.

"frameworks": { 
    "net20": { 
    "dependencies": { 
     "NameOf.AspNetLegacyPackage": "1.2.3" 
    } 
    }, 
    "netstandard1.3": { 
    "dependencies": { 
     "Microsoft.AspNetCore.WebUtilities" : "1.1.0" 
    }, 
    "imports": "dnxcore50" 
    } 
} 

Я использовал netstandard1.3 как минимум для Microsoft.AspNetCore.WebUtilities, но в зависимости от других зависимостей может понадобиться пойти выше или ниже.

NameOf.AspNetLegacyPackage - это имя пакета, который тем функциональным, что и Microsoft.AspNetCore.WebUtilities который вам нужен, но который работает с .NET Framework 2.0, если таковой имеется. Если нет, вам нужно удалить его и самостоятельно записать функции замены.

Затем в использовании кода

#if NETSTANDARD1_3 
    // Code or APIs which is only available in netstandard1.3/net4.6 
    // this includes the Microsoft.AspNetCore.WebUtillities 
#else 
    // Use code or API which runs under .NET Framework 2.0 
#endif 

С другой стороны, если вы собираетесь отказаться от поддержки .NET Framework 2.0 и перейти на 4.5.1, вы можете продолжать использовать Microsoft.AspNetCore.WebUtillities (см NuGet page для зависимостей) его в обоих

"dependencies": { 
    "Microsoft.AspNetCore.WebUtilities" : "1.1.0" 
}, 
"frameworks": { 
    "net451": { 
    }, 
    "netstandard1.3": { 
    "imports": "dnxcore50" 
    } 
} 
1

Вы можете сделать это, поставив свой код в общий проект, а затем создал библиотеку классов, которая предназначается для .Net 2.0, а другой проект библиотеки классов, нацеленную NetStandard. Если в версии 2.0 или Netstandard есть вещи, которые недоступны на другой платформе, вы можете использовать директивы компилятора для записи совместимого кода для каждого.

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