【问题标题】:Controlling transitive dependencies in C#在 C# 中控制传递依赖项
【发布时间】:2019-12-21 03:40:36
【问题描述】:

我正在使用 C# 迭代开发支持库,以放入驻留在我的文件系统中的本地 NuGet 存储库中。我注意到,每当我在我的一个库中添加 NuGet 依赖项,然后在我的一个项目中引用该库时,这会自动获得对我的库的所有 NuGet 依赖项的可见性。

这并不总是需要的,因为我的库中的名称可能会与其依赖项中的名称发生冲突。有没有办法隐藏引用库的依赖关系?

示例: 我正在我的库 Lib 中开发一个名为 foo() 的函数,并且该库引用了 NuGet 依赖项 Dep 也包含一个 foo() 函数。现在,如果我在项目 Proj 中引用 Lib,默认情况下会发生的是 Proj 获得对两个 Lib 的可见性em> 和 Dep 并且它可以使用其中任何一个的 foo()。首选行为是 Proj 只看到 Lib.foo()

更新

也许这可以作为依赖问题的一个例子:我在一个项目中同时导入了 iTextSharp 和 BouncyCastle,这行代码给出了编译错误:

Org.BouncyCastle.X509.X509CertificateParser cp;
Org.BouncyCastle.X509.X509Certificate[] chain;

它说 iTextSharp 和 BouncyCastle 都包含 X509CertificateParserX509Certificate 的完全限定名称,这意味着 iTextSharp 指的是 BouncyCastle,任何依次引用 iTextSharp 的人都可以看到它,即使它没有在Visual Studio 中的引用下拉菜单。

【问题讨论】:

  • “我的库中的名称可能与其依赖项中的名称发生冲突” - 即使是完全限定的,即通过命名空间?你能举一个具体的例子来说明你要避免什么吗?
  • 我编辑了这个问题。现在清楚了吗?
  • 并非如此,因为通常绝对清楚您要调用哪个foo(),因为它会以实例或类型名称为前缀。你能给出一个真正令人困惑的完整、具体的例子吗?
  • 老实说,告诉我Namespaces 的问题从未存在过。
  • 我和乔恩在一起;我不明白这个问题。 C# 中的方法调用始终由 receiver 显式或隐式限定,接收器要么是标识类型的表达式,要么是计算结果为该类型实例的表达式。怎么可能有一个模棱两可的不合格电话?请向我们展示一个示例,以便我们了解您在此处所说的内容。

标签: c# nuget


【解决方案1】:

也许这可以作为依赖问题的一个例子:我在一个项目中同时导入了 iTextSharp 和 BouncyCastle,这行代码给出了编译错误:

Org.BouncyCastle.X509.X509CertificateParser cp;

它说 iTextSharp 和 BouncyCastle 都包含 X509CertificateParser 和 X509Certificate 的完全限定名称,这意味着 iTextSharp 指的是 BouncyCastle 并且任何依次引用 iTextSharp 的人都可以看到它,即使它没有列在参考下拉列表中视觉工作室。

查看 iTextSharp 的源代码,乍一看,作者似乎只是将 BouncyCastle 代码原封不动地复制粘贴到他们的项目中,而不是依赖于程序集。 这是一种不好的做法,因为它会导致您现在遇到的问题。

如果您不幸被要求使用两个库,其中一个库制作了另一个库的精确副本,那么正如您所发现的,编译器不知道哪个库你的意思是当你给它看起来像 完全限定的名称,你会得到一个模棱两可的错误。

解决此问题的最佳方法是不要使用已将其他库复制粘贴到其中的库。但如果这不可能,那么一种方法可以消除它们的歧义,幸运的是,乔恩在十一年前回答了一个关于如何做到这一点的问题:

What use is the Aliases property of assembly references in Visual Studio 8

很遗憾,我现在无法将其作为重复项关闭,但也许其他人可以这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2021-07-26
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多