Поддержка нескольких версий сторонних библиотек
Я создал приложение C# (MyAppV1), для которого требуется сторонний API. Мое приложение должно работать с несколькими версиями этого API, но только с одной версией одновременно. Я настроил свое решение для изменения ссылки и использования оператора для разных конфигураций сборки, и я создаю несколько исполняемых файлов, каждый из которых предназначен для отдельной версии API.
В настоящее время у меня есть такая ситуация:
- MyAppV1_ThirdPartyV1.exe использует ThirdPartyV1.dll
- MyAppV1_ThirdPartyV2.exe использует ThirdPartyV2.dll
- MyAppV1_ThirdPartyV2_5.exe использует ThirdPartyV2.dll (они не изменили имя библиотеки для вспомогательной версии своего программного обеспечения)
- MyAppV1_ThirdPartyV3.exe использует ThirdPartyV3.dll
Я хотел бы иметь возможность вести список версий, возможно, в App.config и загружать соответствующую библиотеку DLL во время выполнения. У меня проблемы с пониманием, с чего начать. Это подходящая стратегия? Я не уверен, как лучше справиться с этой ситуацией. Множественные версии моего приложения отличаются только от библиотеки, на которую ссылаются, мне кажется очень неуклюжим.
Большая часть информации, которую я нахожу, связана с поддержкой нескольких платформ, обработкой требования двух версий одной и той же библиотеки в нисходящем направлении в одно и то же время или необходимостью загрузки обеих одновременно. Я не могу найти информацию о том, как справиться с моей конкретной ситуацией.
1 ответ
Это возможно на уровне проекта. Вы можете создать различные конфигурации в решении, и когда вы добавите ссылки, как показано ниже, это займет нужные DLL
<Choose>
<When Condition="'$(Configuration)|$(Platform)'=='YourSpecialConfiguration1|x64'"><!-- attention here -->
<ItemGroup>
<Reference Include="your.dllv1.name">
<HintPath>yourDllPath_v1\your.dllv1.dll</HintPath><!-- attention here -->
<Private>true</Private>
</Reference>
<!-- more references here -->
</ItemGroup>
</When>
<When Condition="'$(Configuration)|$(Platform)'=='YourSpecialConfiguration2|x64'"><!-- attention here -->
<ItemGroup>
<Reference Include="your.dllv2.name">
<HintPath>yourDllPath_v2\your.dllv2.dll</HintPath><!-- attention here -->
<Private>true</Private>
</Reference>
<!-- more references here -->
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="your.dllname">
<HintPath>yourRegularPath\your.dllname.dll</HintPath><!-- attention here -->
<Private>true</Private>
</Reference>
<!-- AND more references here -->
</ItemGroup>
</Otherwise>
</Choose>
То, что вы видите выше - вариант 1.
Вариант 2 - разные проекты для каждой версии. Недостаток - если вы добавляете файл или ссылку, вам нужно добавить в каждый проект
Вариант 3. Добавьте все ссылки, но объявите разные псевдонимы пространства имен (в окне свойств ссылки) для каждого. Затем в коде сделайте условную компиляцию вроде
ISomething myVar;
#if V1
myVar = new namespace1.ClassX();
#elif V2
myVar = new namespace2.ClassX();
#else
. . . .
#endif
И наконец:
"Я хотел бы иметь возможность вести список версий, возможно, в App.config и загружать соответствующую библиотеку DLL во время выполнения".
- Вам, вероятно, не нужно ни одного из них. Вам просто нужно создавать свои пакеты с разными версиями. Загрузка во время выполнения потребует больше работы по написанию кода, в то же время предоставляя все библиотеки DLL, потому что вы не знаете, что собираетесь загружать в следующий раз.