支持多种版本的第三方库

时间:2018-12-18 20:05:42

标签: c# dll assemblyversions

我创建了一个需要第三方API的C#应用​​程序(MyAppV1)。我的应用程序需要使用该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 :(得分:0)

这在项目级别是可能的。您可以在解决方案中构建不同的配置,并且当您添加如下所示的引用时,它将使用所需的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,因为您不知道下次要加载什么。