我们有一个本地nuget存储区,其中列出了许多应用程序使用的组件列表。
所有这些对象始终具有定义为依赖项的核心组件(比方说PackageB
)。从nuget图的角度来看,我们可以说其中有很多cousin-dependencies。
我们假设核心组件PackageB
的接口类型定义为InterfaceA
和InterfaceC
。
PackageA
具有实现ClassA
的{{1}}。
InterfaceA
具有实现PackageC
的{{1}}。
ClassC
和InterfaceC
都已将PackageA
定义为依赖项,如上图所示。
作为更新的一部分,我们在PackageC
和PackageB
中进行了一些更改。因此,为InterfaceA
和ClassA
创建了新版本,我们在应用程序中将其升级到这些版本。
我们没有意识到,另一个团队也对PackageA
,PackageB
进行了类似的更改;并为InterfaceC
生成了一个新版本-我们的应用中不需要此更新。因此,我们没有升级ClassC
。
没有编译时错误。只是在测试应用程序时,我们才开始遇到以下错误:
“ ClassC类型的VTable设置失败”(Android项目)
该问题的根本原因是,当我们更新PackageC
时,我们最终获得了较新的PackageC
,该版本不再与旧版本的PackageB
兼容。 因此,升级到InterfaceC
的最新版本可以解决此问题。
为避免此问题,我希望能够在目标项目中每次更新诸如PackageC
之类的核心软件包时,强制对所有相关软件包进行更新。
即如果PackageC
被更新,它将自动强制更新为PacakgeB
和PacakgeB
。这可能吗?
我假设有一些规范可以指示nuget或msbuild在应用程序项目级别进行处理。
答案 0 :(得分:1)
似乎您需要在app.config中指定正确的版本
这是我项目中的app.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="XLabs.Serialization" publicKeyToken="d65109b36e5040e4" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.5782.15703" newVersion="2.0.5782.15703" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
您将需要更改publicKeyToken
并设置正确的版本号