为什么Visual Studio 2019中SDK项目引入NuGet后dll出现在项目根目录?
问题1解答
两者的差异来自NuGet包管理机制的不同:
- 传统.NET Framework控制台项目默认使用
packages.config管理NuGet依赖,该机制会将所有直接、传递依赖的全部资产(托管dll、原生dll、资源文件等)下载到解决方案级packages目录,生成时会全量拷贝所有依赖资产到输出目录,因此原生的customLib.dll会被正常复制。 - SDK风格的.NET Framework类库项目默认使用
PackageReference管理NuGet依赖,该机制有两个核心规则:- 所有NuGet包默认存储在全局缓存目录(
C:\Users\{用户名}\.nuget\packages),不会在解决方案下存储副本,也不会生成packages.config文件; - 类库作为中间产物,默认不会拷贝传递依赖的原生运行时资产到输出目录,该逻辑默认交由最终的可执行启动项目统一处理,只有直接引用的NuGet包包含的原生资产才会被拷贝。你之前仅通过
customLib.net间接依赖customLib.redist.windows.x64,属于传递依赖,因此不会被拷贝,触发找不到dll的异常。
- 所有NuGet包默认存储在全局缓存目录(
问题2解答
这个现象是customLib.redist.windows.x64包本身的打包配置导致的:
包作者为了确保原生customLib.dll能被正确识别并拷贝到输出目录,会在包内置的.targets配置中,将runtimes\win-x64下的原生dll作为内容项注入到项目结构中,同时设置了根目录路径映射。Visual Studio中显示的这个dll只是逻辑层面的引用项,文件实际还是存放在全局NuGet缓存目录,并未真的复制到你的项目根目录,右键查看该文件的「属性」-「路径」即可确认实际存储位置。
内容的提问来源于stack exchange,提问作者Denis Kaminsky
相关产品推荐
相关产品推荐

