为什么在编译时我没有引用任何库,但是DLL文件仍会被复制到我的项目的Bin / Debug文件夹中?

4
我很困惑为什么Visual Studio会在我的项目的bin/Debug文件夹中创建/复制大量库dll,尽管我没有引用这些库?这些dll代表同一解决方案下其他项目中使用的库,但我不明白为什么一个给定项目中未引用的库仍然被复制到bin/...文件夹中。我使用NuGet,但我确保解决方案范围内的NuGet管理器只包括提供选择库的特定项目。

1
如果项目A引用了项目B,而项目B又引用了dll C,则如果项目A间接使用了该dll的任何功能,则项目A很可能无法正常运行。这就是为什么dll C会被复制到项目A的bin目录下的原因。 - Andrew Savinykh
2个回答

6
如果项目A引用了项目B,而项目B引用了dll C,则如果该dll的任何功能被间接使用,则项目A很可能无法正常运行。这就是为什么将dll C复制到项目A的“bin”文件夹中的原因。

@zespri,不过我有一个问题:你说“如果从这个dll中间接使用任何功能”。我猜这个陈述是无关紧要的,因为即使我只是在A中引用B而不调用需要在B中引用C的代码,我最终仍然会得到B本身引用的所有库。 - Matt
这基本上就是我面临的问题。我构建了一个共享库,它自身引用其他外部第三方库。但每次链接到我的构建库时,无论是否使用库内容,我的项目立即因为所有复制的dll而膨胀到100mb。 - Matt
@Freddy .net确实只在某些情况下加载dlls。因此,如果你删除了一个被引用的dll,它并不会影响应用程序。这种情况最有可能发生在你只使用库中的一个函数时,而该库需要依赖项,而所需的函数却没有。在这里你无能为力。你可以使用不同(更轻量级)的库,或者使用静态分析工具来确认使用了什么和没使用什么,最后,如果你100%确定某个被引用的库没有被使用,你可以包含一个构建步骤来删除它。 - Andrew Savinykh
1
如何找出直接引用的dll是引用了额外的dll?我正在通过ILSpy浏览一个解决方案,即使在更深层次的dll依赖关系中,我也无法找到这些额外的dll。 - pingo
@pingo - 信息不足。你所说的“这些额外的dll”是什么?请注意,评论此答案可能不是讨论此问题的最佳场所。如果您可以在此网站上提出符合主题的问题,请尽量这样做。如果您无法这样做,则最好在其他地方提出此问题。 - Andrew Savinykh
1
@zaspri - 抱歉,我的表述不够清晰。我所说的“这些额外的dll”是指所有间接引用的项目/ dll。在您的示例中,这将是C.dll以及B和C引用的任何其他内容。我已经通过Mono.Cecil找到了解决方案,并制作了这个https://github.com/pingec/ILDependencyGraph。 - pingo

0
如果您正在使用NuGet,您是将软件包安装到每个项目中,还是仅选择使用它的项目?我不清楚您所说的“但我确保解决方案范围的NuGet管理器仅包括提供所选库的特定项目”的意思。

我只安装它们到选定的项目中,不包括所讨论的项目。 - Matt

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