如何在存在项目依赖的解决方案中使用两个不同版本的包
问题描述
我创建了一个包含三个项目的解决方案:
- 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:
- 在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>
- 在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版本通用)
通过独立输出目录+应用域隔离,让不同项目加载各自的依赖:
- 修改项目输出路径:
- Controller项目输出路径设为
../bin/Controller/$(Configuration) - Runner项目输出路径设为
../bin/Runner/$(Configuration)
- Controller项目输出路径设为
- 在测试项目中创建独立应用域加载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阻断依赖传递:
- 在Runner项目的项目引用配置中,排除Controller的依赖传递:
<ItemGroup> <ProjectReference Include="..\Controller\Controller.csproj"> <PrivateAssets>all</PrivateAssets> <ExcludeAssets>runtime;build;native;contentfiles;analyzers</ExcludeAssets> </ProjectReference> </ItemGroup>
- 在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>
- 手动将Controller的依赖文件复制到测试项目的独立运行目录,确保加载正确版本。
方法4:升级Appium兼容Selenium 4
检查并升级Appium.WebDriver到支持Selenium 4的版本(如v5.x及以上),直接统一使用Selenium 4.11,从根源避免版本冲突。
内容的提问来源于stack exchange,提问作者sl0910
相关产品推荐
相关产品推荐

