项目参考神奇地最终使用了 NuGet 参考

问题描述 投票:0回答:2

我在通过 csproj 文件和/或 DLL 中的相对路径直接添加项目引用时遇到了这个奇怪的问题。它不断恢复到我的 Nuget 文件夹中的 NuGet DLL:C:\Users\jeremy.nuget\packages\

导致问题的步骤:

  1. 删除基本 NuGet 项目引用
  2. 添加对不同解决方案中项目的基本 DLL 的引用。
  3. 检查引用的 DLL 属性的路径,它仍然指向 NuGet 而不是 DEBUG 项目引用。

我已关闭 NuGet 源,Visual Studio 仍使用 NuGet。

如果我重命名 NuGet DLL,然后通过项目引用指定调试文件夹 DLL,则会失败!那么是什么导致它优先查找 NuGet 而不是项目呢?

当我清除 NuGet 缓存时,它给我一个错误,指出并非所有包都可以被删除,但是当我的所有包都消失时,这并不能解决问题,它实际上会产生更多问题。

我应该注意到,此解决方案中的另一个项目也引用了 Base.DLL,但我无法将其更改为不使用 NuGet 引用,这确实感觉像是一个错误。

问题是它覆盖了我的项目参考。是的,我已经尝试将 Debug 文件夹 DLL 复制到本地 NuGet 文件夹上,但这仍然无法让我将 pdb 和符号调试信息调试到 Base 中。

Visual Studio 2022 v17.5.4

c# visual-studio nuget project-reference
2个回答
2
投票

所以我发现发生了什么事,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>

1
投票

我在本地调试 nuget 库的操作如下:

  • 确保我的本地版本号与 nuget 服务器上的最新版本不同。
  • 在本地构建 nuget 文件(使用
    dotnet pack
    或您使用的任何构建系统中的等效项)并将其放置在一些众所周知的文件夹中,例如“artifacts”。
  • 更新使用项目中的版本引用。
  • 在使用项目/解决方案中,打开 Nuget 资源管理器并将“artifacts”文件夹添加为本地 nuget 源。
  • 构建消费项目。您现在应该能够进入库代码(最终,您需要禁用“工具”->“选项”->“调试”下的“仅我的代码”选项)

当然,您可以仅引用一个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>

可能有效,但根据我的经验,这不应该再使用,因为它很容易出现各种问题(例如,如果您正在构建发布版本怎么办?)

© www.soinside.com 2019 - 2024. All rights reserved.