В многозадачном проекте мне доступны только ресурсы более ограничительной структуры?

Предположим, у меня есть многоцелевой проект, что-то вроде этого:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <PackageId>Bugsnag</PackageId>
    <Title>Bugsnag .NET Notifier</Title>
    <TargetFrameworks>net35;net40;net45;netstandard1.3;netstandard2.0</TargetFrameworks>
  </PropertyGroup>
</Project>

Я нацеливаюсь на net35, net40, net45 и другие. NET40 имеет функции, которых нет у net35, а net45 имеет функции, которых нет у net40.

Поэтому я сомневаюсь, что, когда я пишу код своего приложения, мне доступны все функции net45? И если это правда, как это возможно, может ли он скомпилироваться, если, например, у net35 нет некоторых функций, которые я использую?

Спасибо.

1 ответ

Решение

Когда вы нацеливаетесь на несколько платформ, вы должны использовать условные ссылки и символы препроцессора для работы с функциями, которые не поддерживаются всеми целевыми платформами.

Допустим, вы нацелены на.NET 4.0 и 4.5:

<PropertyGroup>
  <TargetFramework>net40;net45</TargetFramework>
</PropertyGroup>

Если у вас есть необязательная зависимость, которая использует платформу 4.5, но не 4.0, вы можете условно ссылаться на нее в своих проектах:

<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
  <Reference Include="Referenced.Assembly.Name" />
</ItemGroup>

Вам также может понадобиться использовать это для ссылки на разные версии зависимости для каждой платформы.

В вашем коде вы можете использовать символы препроцессора, чтобы гарантировать, что новые функции платформы не выдают ошибок при сборке со старой платформой:

public void Example()
{
#if NET45
    // Implementation that uses the 4.5 framework
#else
    // Implementation that uses the 4.0 framework
#endif
}

Полную документацию по фреймворкам с несколькими целями можно найти здесь:
Целевые рамки | Документы Microsoft

Другие вопросы по тегам