«Пакет совместимости» для переноса новых функций .NET Framework? - PullRequest
14 голосов
/ 12 августа 2010

По разным причинам я часто нахожу желательным писать код, совместимый с .NET Framework 2.0 или 3.5 или с .NET Compact Framework, но проблема в том, что в новых .NET есть множество «маленьких» функций. фреймворки, которые недоступны в старых фреймворках или в Compact Framework.

Например, я считаю, что методы расширения действительно полезны, но компилятор зависит от System.Runtime.CompilerServices.ExtensionAttribute для этого. Вы можете легко определить этот атрибут самостоятельно, а затем использовать методы расширения в .NET Framework 2.0 (в C # 3.0+). Аналогично, нетрудно вручную определить небольшие типы .NET 4, такие как Tuple<T1,T2> и Lazy<T>. Кстати, если вы хотите использовать LINQ в .NET 2.0, вы можете использовать LinqBridge .

Теперь предположим, что вы сделали ExtensionAttribute общедоступным, чтобы другие записанные вами сборки могли использовать его. Поначалу это нормально, но что если вы захотите использовать стороннюю библиотеку, которая тоже имела такую ​​же идею? Вы добавляете ссылку на эту библиотеку, и теперь у вас есть столкновение имен. К сожалению.

Я также заметил, что некоторые новые библиотеки доступны только для .NET 4.0 или 3.5, хотя они имеют только незначительные зависимости, которые могут быть решены с помощью пакета совместимости или LinqBridge.

Было бы неплохо, если бы существовали «пакеты совместимости» для более старых версий .NET, которые определяли эти небольшие функции в небольшой DLL, которую вы могли бы оправдать, в том числе в проектах любого размера. Существует ли такая вещь?

Обновление : Судя по молчанию, я думаю, что такого не бывает. Я мог бы сделать такую ​​библиотеку OSS самостоятельно, если есть интерес. Итак, мой новый вопрос: какие меньшие функции .NET 4 (в отличие от монстров вроде WCF / WPF) вы бы упустили, если бы писали для .NET 2, .NET 3.5, .NETCF или Silverlight? Я начну список с ...

  • ExtensionAttribute (не в .NET 2)
  • Func<...> и Action<...> делегатов (не в .NET 2)
  • LINQ-to-objects (не в .NET 2)
  • Tuple<...> (не в .NET 3.5)
  • Lazy<T> и Lazy<T,TMetadata> (не в .NET 3.5)
  • Деревья выражений (не в .NET 2; не полностью в .NET 3.5)
  • Универсальная дисперсия (существует в .NET 2, но недоступна из C # 3 и VB 9)
  • Reflection.Emit (отсутствует в .NETCF; на самом деле это не маленькая функция, но я очень по ней скучаю)

Ответы [ 4 ]

5 голосов
/ 12 апреля 2013

Библиотеки Theraot

Вы можете использовать Theraot.Core из Библиотеки Theraot , чтобы перенести большую часть кода .NET в старые версии, начиная с .NET 2.0благодаря условной компиляции.

Из перечисленных функций включены следующие:

  • ExtensionAttribute
  • Func<...> и Action<...> делегаты
  • LINQ-to-objects
  • Tuple<...>
  • Lazy<T> и Lazy<T,TMetadata>
  • Выражение Tress

Также включеноСледующие функции не упомянуты в вопросе:

  • HashSet<T>
  • SortedSet<T>
  • ThreadLocal<T>
  • IObservable<T> иIObserver<T>
  • BigInteger
  • ConcurrentDictionary<Tkey, TValue>
  • и т. Д. *

Примечание. Планируется поддержка System.Threading.Tasks.

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

3 голосов
/ 27 августа 2010

Это на самом деле не «пакет совместимости», но, поскольку вы упомянули LinqBridge ... еще одна «функция портирования», которую я часто использую, - это параллельные расширения, найденные (среди прочего) в Реактивные расширения (Rx) для Framework 3.5 с пакетом обновления 1 (в System.Threading.dll).Он включает в себя полную реализацию параллельной библиотеки задач и параллельного LINQ (PLINQ).

. Для .Net 4.0 существует пакет асинхронной ориентации для Visual Studio 2012 ( nuget ).) от Microsoft.Который предоставляет множество методов расширения Async и обеспечивает поддержку ключевых слов async / await при использовании компилятора C # 5.

Аналогично для .Net 3.5 существует AsyncBridge , который создаетв библиотеке TPL Reactive Extentions предоставить async / await.Существует также версия AsyncBridge для .Net 4.0, но я не уверен, почему вы хотели бы иметь такую ​​версию от Microsoft.

1 голос
/ 26 апреля 2013

Для .NET 3.5 вы можете использовать FSharp.Core.dll из среды выполнения F # для .NET Framework 2.0.

"Базовая библиотека (FSharp.Core.dll), включенная в этот распространяемый пакет, содержит некоторые API-интерфейсы в пространствах имен System, которые идентичны API-интерфейсам .NET Framework 4, которые необходимы для разработки на F #."

http://msdn.microsoft.com/en-us/library/ee829875%28v=vs.100%29.aspx

Это включает System.Tuple и др. и System.Lazy<T>. (Не Lazy<T,TMetadata>, хотя.) Чтобы использовать их, просто обратитесь к FSharp.Core.dll.

Редактировать: Оказывается, Ленивый в FSharp.Core.dll не является заменой, а скорее классом взаимодействия. Он имеет те же свойства, но не одинаковые конструкторы. Скорее, он создан, например. как это:

Lazy<string> lazy = Microsoft.FSharp.Control.LazyExtensions.CreateFromValue("test");
0 голосов
/ 23 августа 2010

Я не знаю, насколько полезным будет такой список, поскольку он потенциально чудовищен по размеру. CLR одинаков для 2.0, 3.0 и 3.5, так что технически любая из этих функций после 2.0 может превратиться в «пакет совместимости».

-Oisin

...