类型存在于2个程序集中(由于包依赖关系)

3

我遇到了与Type exists in 2 assemblies相同的问题:

类型存在于<ASSEMBLY1.dll>和<ASSEMBLY2.dll>中

我尝试了问题中最受欢迎的答案, 但是我仍然收到错误信息
我认为这是因为我的设置与该问题有很大不同: 我有两个项目ProjectAProjectB,它们使用完全不同的NuGet软件包,这些软件包恰好使用具有完全相同名称但来自不同供应商(没有供应商前缀!)的依赖项/类型。这两个项目都被引用在ProjectC中。

ProjectA
- Packages
-- UnrelatedPackage1
--- Dependency (VendorA)
ProjectB
- Packages
-- UnrelatedPackage2
--- Dependency (VendorB)
ProjectC
- Refences
-- ProjectA
-- ProjectB

现在,我想在ProjectC的代码中捕获ProjectA依赖项中引发的异常:
try {
   ProjectA.SomeClass.DoStuff();
}
catch (ExceptionFromDependency ex)
{ }

但是我无法这样做,因为

类型ExceptionFromDependency存在于<Dependency (VendorA)>和<Dependency (VendorB)>中

我已经按照答案中的建议,在ProejctC中为ProjectB的引用添加了别名projectb,但它没有修复错误——可能是因为源不是项目本身,而是依赖项的依赖项。
我该如何修复这个错误,以便我可以捕获异常?我永远不打算使用来自“Dependency(VendorB)”的任何类型,并且如果这提供更简单的解决方案,我更喜欢将其存在于ProjectB中。


为了添加一些元信息:所涉及的依赖项是由不同包使用的 MySql 适配器,而所提到的异常是 MySql.Data.MySqlClient.MySqlException,但问题实际上是关于这个依赖项问题的。 - wondra
你可以尝试在ProjectB中将UnrelatedPackage2PackageReference设置为<PrivateAssets>all</PrivateAssets>。这样做,您将防止该软件包(及其依赖项)的引用在上游(ProjectBProjectC)可见。 - dymanoid
很遗憾,@dymanoid,<PrivateAssets>all</PrivateAssets>没有任何效果。所有的包仍然在上游可见,错误仍然存在。不过这让我想到了一个问题,它有着完全不同的名称,但是也有类似的问题,并且也被建议使用同样的方法,但是同样没有起作用。幸运的是,另一个答案起作用了。 - wondra
1个回答

1

有一种解决方法可以为软件包本身创建别名,但无法从用户界面访问。请编辑并添加以下TargetProjectC的.csproj文件:

<Target Name="ChangeAliasesOfAssemblies"
        BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
  <ItemGroup>
    <ReferencePath Condition="'%(FileName)' == 'Dependency.VendorB'">
      <Aliases>projectb</Aliases>
    </ReferencePath>
  </ItemGroup>
</Target>

其中Dependency.VendorB是“依赖项(VendorB)”包的没有扩展名的.dll文件名。清理/重建/重新启动IDE。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接