我正在用 C# 迭代开发支持库,将其放入驻留在我的文件系统中的本地 NuGet 存储库中。我注意到,每当我在我的库之一中添加 NuGet 依赖项,然后在我的一个项目中引用该库时,这会自动获得对我的库的所有 NuGet 依赖项的可见性。
这并不总是需要的,因为我的库中的名称可能会与其依赖项中的名称发生冲突。有没有办法隐藏引用库的依赖项?
示例:我正在我的库Lib 中开发一个名为foo()的函数,该库引用了一个 NuGet 依赖项Dep,该依赖项也包含一个foo()函数。现在,如果我在项目Proj 中引用Lib,默认情况下会发生的是Proj获得Lib和Dep 的可见性,并且它可以使用其中任何一个的foo()。首选行为是 Proj 只看到Lib.foo()
更新
也许这可以作为依赖问题的一个例子:我在一个项目中同时导入了 iTextSharp 和 BouncyCastle,这行代码给出了一个编译错误:
Org.BouncyCastle.X509.X509CertificateParser cp;
Org.BouncyCastle.X509.X509Certificate[] chain;
Run Code Online (Sandbox Code Playgroud)
它说,iTextSharp的和BouncyCastle的都包含的完全合格的名称X509CertificateParser和X509Certificate,这意味着iTextSharp的指BouncyCastle的,这是任何人谁又将是指iTextSharp的可见,即使没有在参考文献中列出下拉在Visual Studio。
也许这可以作为依赖问题的一个例子:我在项目中导入了 iTextSharp 和 BouncyCastle,这行代码给出了编译错误:
Org.BouncyCastle.X509.X509CertificateParser cp;
Run Code Online (Sandbox Code Playgroud)
它表示 iTextSharp 和 BouncyCastle 都包含 X509CertificateParser 和 X509Certificate 的完全限定名称,这意味着 iTextSharp 引用 BouncyCastle,并且它对依次引用 iTextSharp 的任何人都可见,即使它未在 Visual Studio 的“引用”下拉列表中列出。
查看 iTextSharp 的源代码,乍一看,作者只是将 BouncyCastle 代码原封不动地复制粘贴到他们的项目中,而不是依赖于程序集。这是一个不好的做法,因为它会导致您现在遇到的问题。
如果您不幸地被要求使用两个库,其中一个库复制了另一个库,那么正如您所发现的,当您向编译器提供看起来像完全限定名称,您将收到歧义错误。
解决这个问题的最好方法是不要使用将其他库复制粘贴到其中的库。但如果这是不可能的,那么有一种方法可以消除它们的歧义,幸运的是,乔恩在十一年前回答了一个关于如何做到这一点的问题:
Visual Studio 8 中程序集引用的 Aliases 属性有什么用
不幸的是,我现在无法将其作为重复项关闭,但也许其他人可以这样做。
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |