Есть ли способ использовать код Multi-Version .NET framework в одном файле?

то есть в PHP вы можете создать библиотеку своих методов в одном файле, и ошибка выдается только при наличии проблем при выполнении (не в компиляторе). Интересно, возможно ли что-то подобное в C#, например, я мог бы поместить выделенные методы для .NET 3.5 и 4.5 в один и тот же файл:

//myFile.cs

public void mymethod_for_v35(object profile)

public async void mymethod_for_v45(dynamic profile)

Итак, я мог бы включить myfile.cs во все проекты (будь то таргетинг на 3.5 или 4.5), а когда я нацелен на 3.5, в приложении я буду использовать первый метод только звонок. Однако, поскольку второй метод предназначен для 4.5 (а сетевые компиляторы 3.5 этого не понимают), мы все равно получаем ошибки компиляции в IDE.

Существует ли какое-либо обходное решение или флаг, разрешающий существование этого метода (даже если он не поддерживается в текущей версии проекта .NET)?

Вероятно, вам понадобятся разные версии вашей сборки, по одной для каждой версии .Net. Но если он не делает что-то принципиально иное, вы можете просто использовать версию 3.5 в 4.5.

phuzi 13.03.2018 12:42

@phuzi Я стараюсь избегать разных сборок ...

T.Todua 13.03.2018 12:43

Используйте символы условной компиляции. Для проекта .NET 3.5 определите какой-нибудь символ (например, «NET35»), для проекта .NET 4.5 определите другой («NET45»). Затем используйте директивы #if NET35 и так далее.

Evk 13.03.2018 12:45

Некоторые конструкции в более новых версиях языка не могут быть скомпилированы даже для более низких версий из-за отсутствия поддерживающих классов, поэтому в целом было бы невозможно создать одну сборку, которая работает правильно везде и по-прежнему поддерживает новые функции (не прибегая к вещам как генерация кода времени выполнения). async / await определенно один из них, как и dynamic. У вас может быть одна база кода (с условной компиляцией или условным включением в файл проекта), но наличие одного двоичного кода в этом случае нереалистично.

Jeroen Mostert 13.03.2018 12:48

@JeroenMostert Вы можете представить в качестве ответа, мне понравилось.

T.Todua 13.03.2018 13:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
73
1

Ответы 1

Самый удобный способ добиться этого - использовать многоцелевую библиотеку с помощью нового синтаксиса проекта SDK (CSP); начните с создания стандартной библиотеки .NET, затем измените <TargetFramework> на <TargetFrameworks>, просто разделив точкой с запятой фреймворки, которые необходимо поддерживать отдельно, например:

<TargetFrameworks>net40;netstandard1.3;netstandard2.0</TargetFrameworks>

(обратите внимание, что другие фреймворки будут поддерживаться неявно - поэтому, если я использую его из проекта net462, будет использоваться сборка net40)

Теперь добавьте проверки #if там, где это необходимо, например:

#if NET40
...
#endif 

или же

#if NETSTANDARD1_3
...
#endif

(обратите внимание, что . сопоставлен с _)

Это означает, что соответствующая поверхность API будет отображаться автоматически.

Если вам нужно использовать разные Рекомендации для разных целевых фреймворков, это также можно сделать в файле проекта с помощью условия для группы элементов:

<ItemGroup Condition = "'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include = "..."/> <!-- whatever you need here -->
</ItemGroup>

При сборке каждая целевая платформа будет оцениваться (включая условия) и строиться отдельно, а затем объединяться вместе при создании nupkg.

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