Какую платформу .NET Framework и С# следует настроить с помощью моей библиотеки классов?

Я создаю библиотеку классов DLL - я хочу сделать ее пригодной для использования как можно большим количеством людей. Какую версию .NET Framework и какую версию С# следует использовать? Возможно ли создать обратную совместимую DLL или разные библиотеки DLL для разных версий? Или Windows автоматически обновляет платформу .NET, поэтому я должен использовать только последнюю версию? Любое руководство ценится!

Ответ 1

Мы нацеливаем несколько версий во время выполнения (.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 

Для пояснения вышеприведенные строки, начинающиеся С#, являются командами препроцессора. Когда вы компилируете решение, С# Compiler (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.

Ответ 2

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

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

  • вы можете использовать лямбда-выражения

  • Вы можете использовать ключевое слово 'var'

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

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

Ответ 3

Я бы сохранил его на 2.0, если вам не нужны функции 3.0 или 3.5.

Ответ 4

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

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

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

Если нет, тогда вам следует настроить 3.5;)

Ответ 5

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

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

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

Ответ 6

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

MyLibrary.DLL

MyLibrary.LINQ.dll

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

В сочетании с использованием подхода, подобным тому, который был упомянут Уилл Хьюз, если вы хотите, чтобы access/option использовал новые функции, когда они были доступны, во время активной разработки используйте последнюю структуру. Когда вы готовы начать выпуск кандидатов на выпуск, установите минимальную структуру, а затем, когда появятся проблемы, неуклонно поднимите версию фреймворка и/или используйте подход #ifdef для разработки.

Ответ 12

Это решение работает достаточно хорошо. Я просто создал два разных проекта, каждый из которых имеет уникальные "Символы компиляции" Свойства проекта → Строка → Условные "и используется в коде следующим образом:

#if NET_4
            xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore; 
#endif
#if NET_3_5
            xmlReaderSettings.ProhibitDtd = false;                
#endif