移动项目时 Visual Studio Nuget 程序集引用损坏

ror*_*ax2 3 .net visual-studio nuget

我有一个复杂的软件解决方案,我想将其分离到多个 Visual Studio 解决方案中以更轻松,但这一切都导致一团糟,因为所有程序集引用都被破坏了。我检查了 .csproj 文件,发现程序集引用是正确的,指向正确的文件系统位置,所以我不明白是什么问题。

因此,我尝试将 NuGet“packages”文件夹复制到离 csproj 文件最近的位置,并更新 HintPath 以指向新位置,然后......它神奇地得到了修复!

例如:

这并不能正常工作:

<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
Run Code Online (Sandbox Code Playgroud)

这工作正常:

<HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
Run Code Online (Sandbox Code Playgroud)

有没有其他人经历过这种行为?在不陷入这个烦人的问题的情况下,构建共享公共项目的解决方案的正确方法是什么?有什么最佳实践吗?

更新:我又遇到了同样的问题,现在解决方案已经恢复到原来的 HintPath 值并再次卸载和加载项目。我不知道是什么原因,但现在项目再次成功编译。也许 Visual Studio 对程序集的路径有任何缓存,并且在将项目移动到另一个文件夹时会变得疯狂?

Ste*_*edy 5

当您引用 Nuget 包时,“HintPath”会添加到您的 .csproj 文件中。顾名思义,它是对编译器的一个提示,它以指向 Nuget Packages 文件夹的相对链接的形式告诉编译器在哪里查找程序集。

这也是 - 正如您所发现的 - 一个烦恼,就好像您在不同的文件系统深度移动或检出项目一样,路径被破坏了。

解决此问题的最简单方法是从 packages.config 移动到较新的 PackageReference 包管理格式。这会将您的 Nuget 引用记录为包引用而不是程序集引用,并删除所有“HintPath”条目。

您可以在 Visual Studio 的 Nuget 包管理器选项中启用此功能。以下屏幕截图来自 Visual Studio 2019:

在此处输入图片说明

从“包管理”复制我的两个设置。

要迁移现有项目,请右键单击“引用”节点或“解决方案资源管理器”中的 packages.config 文件,然后选择“将 packages.config 迁移到 PackageReference” [完整说明]

如果由于某种原因上述方法不可行(例如,您使用的是旧版本的 Visual Studio),则HintPathOverwrite可以在GitHubNuget上调用一个 msbuild 脚本,它可以在编译时动态更改 HintPath。