我在通过 csproj 文件和/或 DLL 中的相对路径直接添加项目引用时遇到了这个奇怪的问题。它不断恢复到我的 Nuget 文件夹中的 NuGet DLL:C:\Users\jeremy.nuget\packages\
导致问题的步骤:
我已关闭 NuGet 源,Visual Studio 仍使用 NuGet。
如果我重命名 NuGet DLL,然后通过项目引用指定调试文件夹 DLL,则会失败!那么是什么导致它优先查找 NuGet 而不是项目呢?
当我清除 NuGet 缓存时,它给我一个错误,指出并非所有包都可以被删除,但是当我的所有包都消失时,这并不能解决问题,它实际上会产生更多问题。
我应该注意到,此解决方案中的另一个项目也引用了 Base.DLL,但我无法将其更改为不使用 NuGet 引用,这确实感觉像是一个错误。
问题是它覆盖了我的项目参考。是的,我已经尝试将 Debug 文件夹 DLL 复制到本地 NuGet 文件夹上,但这仍然无法让我将 pdb 和符号调试信息调试到 Base 中。
Visual Studio 2022 v17.5.4
所以我发现发生了什么事,Obj文件夹中的project.assets.json包含所有NuGet包,删除此文件中的Base引用解决了NuGet覆盖调试项目引用的问题。
我决定删除所有 Artifactory NuGet 和有条件加载 DLL 的标准方法:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<ReferencePath>..\..\..\svc-base\src\bin\Debug\net6.0\</ReferencePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<ItemGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<Reference Include="Company.MS.Base">
<HintPath>$(ReferencePath)Company.MS.Base.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<PackageReference Include="Company.MS.Base" Version="2.1.12" />
</ItemGroup>
TRICK:假设您有另一个项目也引用了 Base,您可以将这个技巧与您自己的 ReferencePath 标签一起使用,例如:
ReferenceInfraHttpPath
:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<ReferenceInfraHttpPath>..\..\..\svc-infrastructure\src\bin\Debug\net6.0\</ReferenceInfraHttpPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<ItemGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<Reference Include="Company.MS.Infrastructure">
<HintPath>$(ReferenceInfraHttpPath)Company.MS.Infrastructure.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<PackageReference Include="Company.MS.Infrastructure" Version="2.1.1" />
</ItemGroup>
我在本地调试 nuget 库的操作如下:
dotnet pack
或您使用的任何构建系统中的等效项)并将其放置在一些众所周知的文件夹中,例如“artifacts”。当然,您可以仅引用一个dll,但由于输出文件夹中只能有一个同名的dll,因此对同一dll(或其相应的nuget)的所有引用必须是等效的。另外,为了避免这种情况下的陷阱,您需要在项目引用中使用
<HintPath>
元素,否则 VS 只会选择与给定名称匹配的第一个 .dll:
<Reference Include="..\Cyara.MS.base\bin\Debug\Cyara.MS.Base.dll">
<Name>CyAra.MS</Name>
<HintPath>..\Cyara.MS.base\bin\Debug\Cyara.MS.Base.dll</HintPath>
</Reference>
这可能有效,但根据我的经验,这不应该再使用,因为它很容易出现各种问题(例如,如果您正在构建发布版本怎么办?)