1

我创建了一个需要第三方 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 库。我不知道从哪里开始。这是一个合适的策略吗?我不确定如何最好地处理这种情况。我的应用程序的多个版本唯一与引用的库不同,对我来说似乎很笨拙。

我找到的大部分信息都与支持多个框架、同时处理下游同一库的两个版本的需求或需要同时加载两者有关。我找不到有关如何处理我的特殊情况的信息。

4

1 回答 1

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,因为您不知道下次要加载什么。

于 2018-12-18T20:12:45.187 回答