在.NET Standard项目中添加引用dll和添加NuGet包的区别

17

我在我的解决方案中有一个.NET Standard 2.0项目,并且我正在使用IConfiguration接口。当我输入名称时,VS建议我引用Microsoft.Extensions.Configuration.Abstractions.dll。如果我这么做,它将添加到参考节点下。但是我也可以将其作为NuGet包添加。两种方法似乎都可以工作。我认为,VS建议的参考是通过项目中引用的.NET Standard SDK添加的。

哪种方式是推荐的引用方法?每种方法的优缺点是什么?


我不确定,所以我不会回答这个问题,但我认为NuGet会自动向您的项目添加引用,而且我更喜欢NuGet,因为它允许在NuGet仓库中有新版本时更新包。 - tym32167
你从哪里获取dll引用?它应该是在.NET标准项目中使用的NuGet包。 - Martin Ullrich
也不会直接给出答案,但有几个事情需要注意:
  1. Nuget 可以恢复整个解决方案的引用
  2. 通过 Nuget 添加与添加引用相同的 DLL
  3. 更容易更新/还原到特定版本
  4. 在持续集成/构建服务器期间,它直接从 Nuget 拉取
  5. 如果使用自定义 Nuget 源,可以从自己的源安装/更新/还原。
- Inept Adept
@MartinUllrich 这个引用来自于类似 Program Files\dotnet\sdk\NuGetFallbackFolder 这样的文件夹。它在项目文件中使用旧的引用格式,而不是包引用。 - Stilgar
1
@MartynWeber 我最初的想法是使用dll引用,以此减少依赖项和构建过程的复杂性。另一方面,现在我已经看了项目文件引用包的方式,可能更简单的方法是作为NuGet包引用。 - Stilgar
@Stilgar 我也曾有同样的想法,但我目前承担的一个较大项目是将我们当前的许多项目打包为NuGet包,并且通过我们的CI系统,设置解决方案级别的引用更容易。如果我能像MartinUllrich那样写出一个明确定义的答案,我会将其发布为答案,但是喝了太多啤酒使我无法清晰地表达 :D - Inept Adept
1个回答

10

从手动下载的NuGet包或安装在已知位置的NuGet包中直接引用DLL文件可以加快还原和构建过程,但也存在一些危险。

NuGet包在被引用时可以执行许多DLL文件无法执行的操作。如果想要从包中引用DLL,请确保包不会执行以下操作/考虑以下可能性:

  • 其他NuGet包可能会作为依赖项被拉入进来。如果你从一个更新的包中升级了DLL,则需要检查依赖项是否已更改并相应地更新项目。
  • NuGet包可以提供不同的引用和实现程序集 - 例如,一个NuGet包可以在其ref/文件夹中提供“API表面”的dll,然后在其lib/文件夹中包含针对.NET Framework、.NET Core、Xamarin和更多的不同实现程序集。你必须仔细选择要引用于项目类型的正确DLL文件 - .NET Standard库可能需要引用一个ref-assembly(例如,ref/netstandard1.4/foo.dll)进行编译,而使用此库的.NET Framework应用程序需要引用来自例如lib/net452/foo.dll的程序集。
  • NuGet包可能会包含其他运行时特定和/或目标框架特定的内容,该内容被添加到构建输出中。这可能是本机库(在Windows上是.dll,在Linux上是.so - 来自于runtime/子文件夹),也可能是任何内容文件。在没有NuGet的情况下正确处理这些内容很棘手,因为.nuspec文件还可以为内容文件定义构建操作。
  • NuGet包中可以包含构建逻辑,该构建逻辑在构建期间设置某些属性或执行目标,这对于正确使用产品是必要的。手动进行此操作是不可能的,除非以正确的方式编辑.csproj文件。

如果NuGet包不使用上述任何一个(您需要手动检查),则通常可以安全地引用DLL。但是,更新DLL及其依赖项需要大量工作,使用NuGet更容易。

此外,您提到直接从.NET Core工具的nuget回退文件夹中引用。此文件夹不能保证包含其他安装中DLL的特定版本(取决于已安装的SDK版本),甚至可能在不同的机器上安装在不同的位置,使您的项目文件对其他人无法使用(以及在非Windows机器上构建)。


谢谢,看起来引用 NuGet 包本身是明确的选择。我本来就会这样做,但 VS 建议使用这个修复方法(直接引用 dll),所以我想知道如果工具提示我做其他事情,那么我是否做错了。 - Stilgar
我们能否在Nuget包中添加预编译视图,并在安装的应用程序中引用该预编译视图。 - Dhanil Dinesan

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