Вот пример кода.
Скажем, у вас есть две библиотеки DLL, которые предоставляют используемый вами API, одна новее. Они используют одно и то же пространство имен и множество одинаковых классов и методов. В моем примере, вот код для двух версий API:
API V1.0:
namespace API
{
public class Class1
{
public void Call1()
{
Console.WriteLine("Call1 in API1");
}
}
}
API V2.0:
namespace API
{
public class Class1
{
public void Call1()
{
Console.WriteLine("Call1 in API2");
}
public void Call2()
{
Console.WriteLine("Call2 in API2");
}
}
}
Вы хотите написать оболочку, в которой для начала используются общие вещи, поэтому возьмите общее и создайте общую сборку, используя интерфейс и абстрактный базовый класс.
Интерфейс:
namespace ApiCommon
{
public interface ICommon
{
void Call1();
}
}
Абстрактный класс:
namespace ApiCommon
{
public abstract class CommonBase : ICommon
{
#region ICommon Members
public void Call1()
{
Class1 common = new Class1();
common.Call1();
}
#endregion
}
}
Теперь, чтобы расширить ваш абстрактный класс, используя API V1.0 или V2.0, создайте новый проект и добавьте ссылку на вашу Common dll.
Расширенный класс:
using ApiCommon;
namespace ConditionalTest
{
public class MyApi : CommonBase
{
public void Call3()
{
Console.WriteLine("Call 3 MyApi");
}
}
}
Теперь проводка, чтобы она заработала.
Создайте две новые конфигурации сборки в Configuration Manager, назовите их API1 и API2 и скопируйте настройки из Debug.
Отредактируйте общие настройки .csproj и добавьте следующие строки:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'API1|AnyCPU' ">
<Reference Include="API1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\API1\bin\Debug\API1.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'API2|AnyCPU' ">
<Reference Include="API2, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\API2\bin\Debug\API2.dll</HintPath>
</Reference>
</ItemGroup>
Теперь, когда вы строите, в зависимости от выбранной вами опции Build Config (API1 или API2), он свяжет Common.dll с правильным API, и вам будет хорошо.
Чтобы проверить это, создайте консольное приложение с кодом, подобным следующему:
namespace ConditionalTest
{
class Program
{
static void Main(string[] args)
{
MyApi test = new MyApi();
test.Call1();
test.Call3();
}
}
}
В зависимости от выбранной вами сборки, он либо выплюнет:
Call1 in API1
Call 3 in MyApi
или
Call1 in API2
Call 3 in MyApi