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