то есть в 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)?
@phuzi Я стараюсь избегать разных сборок ...
Используйте символы условной компиляции. Для проекта .NET 3.5 определите какой-нибудь символ (например, «NET35»), для проекта .NET 4.5 определите другой («NET45»). Затем используйте директивы #if NET35 и так далее.
Некоторые конструкции в более новых версиях языка не могут быть скомпилированы даже для более низких версий из-за отсутствия поддерживающих классов, поэтому в целом было бы невозможно создать одну сборку, которая работает правильно везде и по-прежнему поддерживает новые функции (не прибегая к вещам как генерация кода времени выполнения). async / await определенно один из них, как и dynamic. У вас может быть одна база кода (с условной компиляцией или условным включением в файл проекта), но наличие одного двоичного кода в этом случае нереалистично.
@JeroenMostert Вы можете представить в качестве ответа, мне понравилось.





Самый удобный способ добиться этого - использовать многоцелевую библиотеку с помощью нового синтаксиса проекта 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.
Вероятно, вам понадобятся разные версии вашей сборки, по одной для каждой версии .Net. Но если он не делает что-то принципиально иное, вы можете просто использовать версию 3.5 в 4.5.