Для какой Платформы.NET и версии C# я должен быть нацелен со своей библиотекой классов?

Более новые.Net Документы теперь имеют таблицу, чтобы помочь Вам решить, который является лучшим для использования в ситуации.

Из MSDN" Новые Рекомендации для Использования Строк в Microsoft.NET 2.0 "

Сводка: Кодируйте владельцев, ранее использующих InvariantCulture для сравнения строк, преобразования регистра, и сортировка должна сильно рассмотреть использование нового набора String перегрузки в Microsoft.NET 2.0. А именно, данные, которые разработаны, чтобы быть агностическими культурой и лингвистически не важные , должны начать определять перегрузки с помощью или StringComparison.Ordinal или StringComparison.OrdinalIgnoreCase члены нового StringComparison перечисление. Они осуществляют сравнение байта байтом, подобное strcmp, который не только избегает ошибок от лингвистической интерпретации чрезвычайно символьных строк, но обеспечивает лучшую производительность.

10
задан Nosrama 30 July 2009 в 11:08
поделиться

10 ответов

Мы ориентируемся на несколько версий среды выполнения одновременно (.NET 1.1, .NET 2.0 и .NET 3.5) для некоторых продукты.

Мы обрабатываем это несколькими способами:

  • Отдельные файлы решения и проекта и для каждого из .NET 1.1, 2.0 и 3.5 SP1, но ссылаясь на одни и те же исходные файлы.

например:

 \ProductFoo_1_1.sln (.NET 1.1 solution, VS 2003)
 \ProductFoo_2_0.sln (.NET 2.0 solution, VS 2008)
 \ProductFoo_3_5.sln (.NET 3.5 solution, VS 2008)

 \FooLibrary\FooLibrary_1_1.csproj (.NET 1.1 Project, VS 2003) 
 \FooLibrary\FooLibrary_2_0.csproj (.NET 2.0 Project, VS 2008) 
 \FooLibrary\FooLibrary_3_5.csproj (.NET 3.5 Project, VS 2008) 

 \FooLibrary\FooClass.cs (shared amongst all Projects)
 \FooLibrary\FooHelpers_1_1.cs (only referenced by the .NET 1.1 project)

 \FooService\FooService_3.5.csproj (.NET 3.5 Project, VS 2008)
 \FooService\FooService.cs
  • Определение символов NET_X_X в каждом из решений

  • Для кода, специфичного для .NET Framework, мы используем инструкции препроцессора, такие как:

public void SomeMethod(int param)
{
#ifdef NET_1_1
 // Need to use Helper to Get Foo under .NET 1.1
  Foo foo = Helper.GetFooByParam(param);
#elseif NET_2_0 || NET_3_5
 // .NET 2.0 and above can use preferred  method. 
  var foo =  new Foo { Prop = param }; 
  foo.LoadByParam();  
#endif 
  foo.Bar();
}

#ifdef NET_3_5
// A method that is only available under .NET 3.5 
public int[] GetWithFilter(Func Filter)
{ 
  // some code here
}
#endif 

Для пояснения, приведенные выше строки начинаются с # - команды препроцессора. Когда вы компилируете решение, компилятор C # (csc) предварительно обрабатывает исходные файлы. Если у вас есть оператор #ifdef , то csc выполнит оценку, чтобы определить, определен ли этот символ, и если да, то включит строки в этот сегмент при компиляции проекта.

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

#if DEBUG_VERBOSE
  Logging.Log("Web service Called with parameters: param = " + param);
  Logging.Log("Web service Response: " + response); 
  Logging.Log("Current Cache Size (bytes): " + cache.TotalBytes); 
  // etc. 
#endif 
  • Затем у нас есть сценарии NAnt, которые автоматизируют создание выпуска для каждой версии .NET. Нам довелось управлять всем этим через TeamCity, но мы также можем запускать сценарии NAnt вручную.

Это действительно усложняет задачу, поэтому мы делаем это только там, где нам нужно поддерживать устаревший экземпляр .NET 1.1 или 2.0 ( например, когда клиент не может / не хочет обновлять).

Я полагаю, что когда появится .NET 4.0, мы сделаем то же самое и просто добавим символ NET_4_0.

10
ответ дан 3 December 2019 в 14:11
поделиться

Я бы оставьте значение 2.0, если вам не нужно использовать функции 3.0 или 3.5.

9
ответ дан 3 December 2019 в 14:11
поделиться

Если бы я начал новый проект, Я всегда буду использовать новейшую среду выполнения! Если доступна версия 3.5, зачем мне начинать проект в версии 2.0 или 1.0, если я не знал, что с новой версией что-то серьезно не так? Новые версии означают исправление старых ошибок и добавление новых функций, так что это хорошо.

Когда дело доходит до обновления старого проекта до новой версии, вам необходимо учитывать ваши прибыли и убытки. Если он испортился, обновите его, если не придерживайтесь старой версии.

Будьте осторожны, потому что новые инструменты могут не поддерживать старые версии. Хотя это не относится к 2010 году, поскольку он поддерживает все версии до 2.0.

2
ответ дан 3 December 2019 в 14:11
поделиться

Я голосую за ответ Эрика ван Бракеля. Также я хотел бы предложить, чтобы если вы хотите поддерживать такие функции 3.5, как LINQ и методы расширения, вы можете создать дополнительную библиотеку, скажем

MyLibrary.DLL

MyLibrary.LINQ.dll

, используя тот же подход. как и MS (когда они оставили версию System.dll 2.0, но добавили все новые функции в System.Core.dll)

0
ответ дан 3 December 2019 в 14:11
поделиться

Я бы нацелился на версию 2.0 с библиотекой, содержащей основные функции, и добавил бы дополнительную библиотеку, нацеленную на 3.5, чтобы добавить некоторые методы расширения на основе вашей основной библиотеки.

0
ответ дан 3 December 2019 в 14:11
поделиться

попробуйте следующее:

переключите режим нацеливания на framework 2.0 (удалив ссылку на System.Core).

если он не компилируется, попробуйте добавить ссылку на linqbridge.dll :

Если нет, то вы должны выбрать 3,5;)

4
ответ дан 3 December 2019 в 14:11
поделиться

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

0
ответ дан 3 December 2019 в 14:11
поделиться

Лично я бы выбрал .NET 2.0. Это означает, среди прочего:

  • Нет методов расширения (хотя есть обходной путь)
  • Нет linq

  • Вы МОЖЕТЕ использовать лямбда-выражения

  • Вы МОЖЕТЕ использовать ключевое слово 'var'

Дело в том, что , вы можете использовать функции языка C # 3.x (так называемый синтаксический сахар), но вы не можете использовать библиотеки, предназначенные для C # 3.x (System.Core, чтобы назвать один, включает методы расширения и linq).

Я бы не стал пытаться поддерживать C # 1.x, поскольку он сильно отличается от C # 2.x и выше. Кроме того, я ожидаю, что большинство людей, которые будут использовать вашу библиотеку, - это люди, создающие новые вещи, которые в здравом уме не стали бы использовать C # 1.x; -)

11
ответ дан 3 December 2019 в 14:11
поделиться

Это зависит от того, для чего предназначена dll. Если у него просто общая логика C #, которую вы хотели бы сделать доступной для других, то .net 2.0, вероятно, ваш лучший выбор. Однако, если это имеет какое-либо отношение к более новым функциям в .net, таким как WPF, EF, WCF, silverlight и т. Д., Тогда это должна быть версия .net, которая поддерживает эту конкретную функцию.

Лично я бы сказал, пишите это в .net 3.5 только потому, что переход с .net2.0 на .net3.5 довольно безболезнен, потому что критических изменений не так много, как при переходе с .net1.x на .net2 .0. :)

0
ответ дан 3 December 2019 в 14:11
поделиться

Я не думаю, что кто-то больше использует .Net 1.1. Так что, если вы действительно не хотите использовать функции 3.5, 2.0 должно быть в порядке. Кроме того, если у вас есть контроль над тем, кто на самом деле будет использовать вашу библиотеку, это тоже зависит от них. Если у них есть последняя версия фреймворка, вы можете использовать ее.

0
ответ дан 3 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: