Есть ли разница/причина для создания цели построения dnx50 в дополнение к dnx451?

Обычно мы видим следующие цели в project.json:

"frameworks": {
    "net45": {},
    "dnx451": {},
    "dnxcore50": { }
}

dnxcore50 будет единственной переносимой версией кода проекта, а dnx451 фактически нацелен на .Net 4.5.1 mscorlib и т.д.

Теперь, если я добавлю еще одну цель под названием dnx50, это создаст допустимый вывод и будет работать нормально.

Разница между dnx451 и dnx50 заключается в том, что она ссылается на разные DLL-сборки DLL

Например mscorlib.dll:

  • dnx451 ссылки C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\mscorlib.dll
  • dnx50 ссылки C:\Windows\Microsoft.NET\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll, которые по существу являются версией .net 4.6.

Вопрос:

Имеет ли смысл создать эту цель dnx50 для вашей пользовательской библиотеки, например? В основном для целевого .net 4.6 и вам нужны определенные функциональные возможности портативного устройства dnxcore50?

Или цель dnx451 на самом деле достаточно, и если мне не нужна определенная функция из более поздних версий .net(4.5.2, 4.6), эта цель будет использовать .net 4.6 в любом случае, если она установлена в системе, и я просто нацелен на самую низкую версию, необходимую для моего проекта?

Означает ли это, что наличие обоих объектов, цель dnx451 и dnx50, фактически создало бы тот же результат, правильно?

Ответ 1

Подробнее см. этот. Вот список всех типов, которые вы можете использовать:

  • dnxcore50 - DNX SDK, работающий на CoreCLR/CoreFx
  • dnx451 - DNX SDK, работающий на .Net 4.5.1 (Desktop CLR/Full BCL и FCL)
  • net46 -.Net Framework SDK, работающий на .Net 4.6 (Desktop CLR/Full BCL и FCL).
  • uap10.0 - UWP SDK, работающий на .Net Native/CoreFx
  • dotnet - любой чистый IL-код, который объявляет свои зависимости (вместо контракта PCL). Рамочные зависимости доступны для .Net 4.6, DNX или UWP.

Для .NET 4.5 вам нужно использовать dnx45 для проектов ASP.NET и net45 для других проектов, предназначенных для .NET 4.5. Какая из ваших целей зависит от того, что вы хотите сделать, вы можете даже напасть на более чем один за раз.

В настоящее время .NET Core (DNX) имеет очень ограниченную функциональность. Если это не дает вам достаточно, то настройте полную .NET runtime dnx46 для ASP.NET 5 с использованием .NET 4.6 и net46 для других проектов с использованием .NET 4.6.

Ответ 2

Имена, которые вы задаете для целей сборки, являются вашими собственными, и вы можете использовать любое имя, которое вы выберете, чтобы это работало нормально.

Цели построения также генерируют глобальные операторы #define верхнего регистра, которые вы можете использовать для брекетинга логических блоков #if DNXCORE50 в вашем коде.

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