在 .NET 中,我什么时候必须引用外部库也引用的 DLL?

In .NET, when do I have to reference a DLL that an external library also references?

我正在尝试了解我的 .NET 项目何时需要引用外部库引用的 DLL。

实际例子:Microsoft.Bot.Builder依赖于Chronic.Signed.dll

如果我引用 Microsoft.Bot.Builder.dll,我是否也必须在自己的项目中添加对 Chronic.Signed.dll 的引用,即使我没有直接使用它?还是只有在某些情况下才需要?

除非您引用这些包中的特定内容,否则您不需要这样做。如果您缺少会导致您的代码无法编译或 运行 的依赖项,编译器很可能会抱怨它。

作为一个需要安装多个 DLL 的简单示例,当您通过 NuGet 安装程序包时,有时程序包会具有将安装的依赖项,以便能够 运行 中的代码包裹。但是,它们中的大多数将独立于任何其他包进行安装。您可以通过将一些引用放在另一个项目中不存在的库项目中,然后尝试 运行 来自主项目的代码来测试它如何跨项目工作。您不需要引用与库项目相同的 DLL。

If I reference Microsoft.Bot.Builder.dll, do I always have to also add a reference to Chronic.Signed.dll in my own project, even if I'm not using it directly? Or do I only have to only under certain circumstances?

当您使用 NuGet 添加包时,相关包也会随它们一起安装。因此,当您添加 Microsoft.Bot.Builder.dll 时,它也会自动安装 Chronic.Signed.dll。

现在到了,为什么?一些 lib 包依赖于其他包。就像 Microsoft.Bot.Builder.dll 中的函数可能正在使用 Chronic.Signed.dll 中的一些辅助函数或主函数。因此,如果您删除 Chronic.Signed.dll 的引用,您将收到缺少依赖项或引用的错误。

do I always have to also add a reference to Chronic.Signed.dll in my own project, even if I'm not using it directly?

是的,因为 Microsoft.bot 正在内部使用它。

并非所有包都依赖于其他包。有些是独立的,从不安装任何其他 dll,但有些会。

当您使用 Microsoft.Bot.Builder 中的某些内容时,您需要在其 public API 中公开来自 Chronic.Signed 的内容时执行此操作。例如(并且我自己没有通过库),假设 Chronic.Signed.IFooMicrosoft.Bot.Builder.FooImpl 实现的接口。如果您在代码中引用 Microsoft.Bot.Builder.FooImpl,那么您还需要引用 Chronic.Signed,这样您的代码才能访问接口。