You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在存在项目依赖的解决方案中使用两个不同版本的包

问题描述

我创建了一个包含三个项目的解决方案:

  • Controller项目:使用Appium.WebDriver,该组件依赖Selenium 3.141版本
  • Runner项目:使用Selenium 4.11版本,同时依赖Controller项目
  • 测试项目:依赖Runner项目

执行测试时运行失败,原因是Controller项目的方法实际加载了Selenium 4.11版本,但这些方法需要与Appium兼容的Selenium 3.141版本;而Runner项目依赖Selenium 4.11的特性,无法降级到3.141。我曾尝试配置PrivateAssets和ExcludingAssets但未成功,请问如何实现不同项目使用对应版本的Selenium?

解决方案结构

可行解决方案

方法1:程序集绑定重定向(仅限.NET Framework)

如果基于.NET Framework,可以通过绑定重定向强制不同项目加载对应版本的Selenium:

  1. 在Controller项目的App.config中添加配置,强制加载Selenium 3.141:
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="WebDriver" publicKeyToken="1c28ed7c7c74b991" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.11.0.0" newVersion="3.141.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="WebDriver.Support" publicKeyToken="1c28ed7c7c74b991" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.11.0.0" newVersion="3.141.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
  1. 在Runner项目的配置文件中添加反向重定向,确保加载Selenium 4.11:
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="WebDriver" publicKeyToken="1c28ed7c7c74b991" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-3.141.0.0" newVersion="4.11.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="WebDriver.Support" publicKeyToken="1c28ed7c7c74b991" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-3.141.0.0" newVersion="4.11.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

方法2:应用域隔离(跨.NET版本通用)

通过独立输出目录+应用域隔离,让不同项目加载各自的依赖:

  1. 修改项目输出路径:
    • Controller项目输出路径设为../bin/Controller/$(Configuration)
    • Runner项目输出路径设为../bin/Runner/$(Configuration)
  2. 在测试项目中创建独立应用域加载Controller程序集:
var setup = new AppDomainSetup
{
    ApplicationBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Controller"),
    PrivateBinPath = "Controller"
};
var controllerDomain = AppDomain.CreateDomain("ControllerDomain", null, setup);
// 跨应用域调用需继承MarshalByRefObject或使用可序列化接口
var controller = (IController)controllerDomain.CreateInstanceAndUnwrap(
    "Controller", "YourNamespace.ControllerClass");
controller.RunAppiumTasks();

方法3:依赖资产隔离(.NET Core/.NET 5+)

通过PrivateAssets和ExcludeAssets阻断依赖传递:

  1. 在Runner项目的项目引用配置中,排除Controller的依赖传递:
<ItemGroup>
  <ProjectReference Include="..\Controller\Controller.csproj">
    <PrivateAssets>all</PrivateAssets>
    <ExcludeAssets>runtime;build;native;contentfiles;analyzers</ExcludeAssets>
  </ProjectReference>
</ItemGroup>
  1. 在Controller项目中标记自身的Selenium依赖为私有:
<ItemGroup>
  <PackageReference Include="Appium.WebDriver" Version="x.x.x">
    <PrivateAssets>all</PrivateAssets>
  </PackageReference>
  <PackageReference Include="Selenium.WebDriver" Version="3.141.0">
    <PrivateAssets>all</PrivateAssets>
  </PackageReference>
</ItemGroup>
  1. 手动将Controller的依赖文件复制到测试项目的独立运行目录,确保加载正确版本。

方法4:升级Appium兼容Selenium 4

检查并升级Appium.WebDriver到支持Selenium 4的版本(如v5.x及以上),直接统一使用Selenium 4.11,从根源避免版本冲突。


内容的提问来源于stack exchange,提问作者sl0910

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:22:08