Можно ли сделать директиву препроцессора зависимой от версии .NET Framework? - PullRequest
15 голосов
/ 27 декабря 2010

Вот конкретный пример того, что я хочу сделать.

Рассмотрим функцию string.Join. До .NET 4.0 было только две перегрузки, каждая из которых требовала параметра string[].

Начиная с .NET 4.0, появились новые перегрузки, принимающие более гибкие типы параметров, включая IEnumerable<string>.

У меня есть библиотека, которая включает в себя функцию Join, которая делает то же самое, что и функция .NET 4.0 string.Join. Мне просто интересно, смогу ли я сделать реализацию этой функции зависимой от целевой платформы .NET. Если 4.0, он может просто вызвать string.Join внутри. Если 3.5 или старше, он может вызвать свою собственную внутреннюю реализацию.

  1. Имеет ли эта идея смысл?
  2. Если это имеет смысл, какой самый логичный способ сделать это? Я предполагаю, что просто предполагаю, что директива препроцессора была бы наиболее целесообразной, поскольку вызов string.Join с параметром IEnumerable<string> не будет даже компилировать при нацеливании на версию .NET старше 4.0; поэтому любой подход, который я использую, должен был бы иметь место до компиляции. (Проверка свойства Environment.Version во время выполнения, например, не будет работать.)

Ответы [ 3 ]

15 голосов
/ 27 декабря 2010

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

Затем, используя это, вы можете определить, следует ли использовать перегрузки .NET 4 или собственную библиотеку.

2 голосов
/ 27 декабря 2010

Да, я думаю, что это имеет смысл (для вашего конкретного случая, поскольку изменения относительно незначительны), хотя очевидно, что подобные вещи могут довольно быстро выйти из-под контроля.

ИМХО, наиболее логичным способом было бы создать различные конфигурации решений / проектов для каждой версии, затем определить пользовательский символ (скажем, NET40) в ваших конфигурациях 4.0, а затем использовать его с * 1004. *. Я не уверен, что конфигурации позволят вам изменить версию во время выполнения (это, очевидно, было бы идеальным решением), но в худшем случае вам придется менять версию вручную.

РЕДАКТИРОВАТЬ: Я только что увидел ответ, связанный с ответом Джошуа, и это кажется более обтекаемым решением, но я все равно оставлю это здесь, поскольку он, строго говоря, отвечает на вопрос .

1 голос
/ 06 августа 2014

Вы можете подготовить свой код для .NET 4.0 и написать аналогичный код для базы .NET 3.5 на основе framework .

#if NOT_RUNNING_ON_4
public static class GuidExtensions
{
   public static bool TryParse(this string s, out Guid result)
   {
       if (s.IsNullOrEmpty())
           return null;
       try
       {
          return new Guid(s);
       }
       catch (FormatException)
       {
          return null;
      }
   }
}
#else
    #error switch parsing to .NET 4.0
#endif

И положи свою строчку на свой * .csproj

<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>
...