поддержка нескольких версий сторонних библиотек - PullRequest
0 голосов
/ 18 декабря 2018

Я создал приложение 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 Ответ

0 голосов
/ 18 декабря 2018

Это возможно на уровне проекта.Вы можете создавать различные конфигурации в решении, и когда вы добавляете ссылки, как показано ниже, это займет требуемые 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

И наконец:

"Я хотел бы иметь возможность вести список версий, возможно, в приложении.config и загрузите соответствующую библиотеку dll во время выполнения. "

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

...