【问题标题】:Visual Studio 2017 using old Nuget package instead of assembly referenceVisual Studio 2017 使用旧的 Nuget 包而不是程序集参考
【发布时间】:2018-10-28 03:56:57
【问题描述】:

我正在开发一个通用库。我们称之为 My.Common。

My.Common 版本 1 已上传到我的 Intranet Nuget 服务器,并在其他几个库中使用,例如 My.Logging 和 My.Navigation。

在处理通过 Nuget 使用 My.Common、My.Logging 和 My.Navigation 的 .Net Core 应用程序时,我发现了 My.Common 中的一个错误。所以我需要修复版本 2 的 My.Common。该错误会影响应用程序直接使用的功能 - 它对其他库没有影响,它们可以继续使用版本 1。

我打开 My.Common 的代码,尝试修复并编译。在应用程序中,我删除了 My.Common 的 Nuget 包,并在其 bin 文件夹中添加了对 My.Common DLL 的引用。

此时我发现我的应用程序中没有看到对 My.Common 的更改。在 My.Common 的属性窗口中,路径显示为:

C:\Users\foo\.nuget\packages\my.common\1.0.0\lib\netcoreapp2.0\My.Common.dll

这是引用在 .csproj 中的外观:

  <ItemGroup>
    <Reference Include="My.Common">
      <HintPath>C:\Projects\My.Common\bin\Debug\netcoreapp2.0\My.Common.dll</HintPath>
    </Reference>
  </ItemGroup>

尽管我已将它添加为程序集引用,但它仍被其 Nuget 包覆盖并提供服务!

由于程序集和 Nuget 包有不同的版本,我想我可以通过更明确地了解版本来解决这个问题。

  <ItemGroup>
    <Reference Include="My.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
      <HintPath>C:\Projects\My.Common\bin\Debug\netcoreapp2.0\My.Common.dll</HintPath>
      <SpecificVersion>true</SpecificVersion>
    </Reference>
  </ItemGroup>

设置为 true 时,Visual Studio 似乎根本无法找到程序集 - 属性中的路径为空白,应用程序填充“(您是否缺少程序集引用?)”错误。

我需要获取 My.Logging 和 My.Navigation 的本地副本,用程序集引用替换他们的 My.Common Nuget 包,编译,然后用程序集引用替换原始应用程序中的所有 Nuget 包,这似乎很极端.

如何让 Visual Studio 真正使用本地程序集引用?

【问题讨论】:

  • 我将创建库版本 2 的预发布包(类似于 2.0.0-beta001)并使用它,而不是尝试使用程序集引用。如果它只是一个错误修复,并且没有重大更改,只需更新版本的第三个数字 (1.0.1-beta001)
  • 我试过了,但是开发起来很不方便。每一个细微的变化都需要更改版本号并将更新的包安装到应用程序中,并且您不能像在本地程序集中那样单步执行代码。

标签: visual-studio visual-studio-2017 .net-core nuget .net-assembly


【解决方案1】:

我也遇到过这个问题,这里建议的其他答案在我的场景中是不可行的。据我所知,package.assets.json 中的引用将优先于本地系统上 dll 的任何 HintPath。

当 NuGet 包恢复时,package.assets.json 文件会在您的解决方案的 obj 文件夹中生成。来自文档here

当 NuGet 还原过程在构建之前运行时,它会解决 依赖项首先在内存中,然后将结果图写入 使用项目的 obj 文件夹中名为 project.assets.json 的文件 包参考。 MSBuild 然后读取此文件并将其转换为 一组可以找到潜在参考的文件夹,然后 将它们添加到内存中的项目树中。

在我的情况下,我删除了对我的库的 NuGet 引用,添加了对本地文件夹的引用并验证了我的 csproj 文件中的 HintPath 指向它 - 如下所示:

<Reference Include="MyLibrary">
  <HintPath>..\..\MyLibrary\bin\Debug\netstandard2.0\MyLibrary.dll</HintPath>
</Reference>

但是,此文件仍在 package.assets.json 中,因为我的解决方案使用的其他 NuGet 包之一也引用了本地 NuGet 源中的 MyLibrary.dll 副本。由于存在此引用,因此 MsBuild 忽略了我的 csproj 中 MyLibrary 的 HintPath,并采用其他 NuGet 包使用的 package.assets.json 中提供的路径。

我必须做的是删除对其他 NuGet 包的引用,并引用它的本地副本,该副本已针对 MyLibrary.dll 的本地副本重建。这样,在 NuGet 中没有使用 MyLibrary.dll。我还删除了解决方案中所有项目的 package.assets.json,并允许 NuGet 从头开始​​重建它们。

编辑:在使用 VS2019 Preview 2.0 时,我再次看到了这种行为,而上述步骤这次并没有解决问题。幸好我的本地dll的版本号和NuGet源码中的不一样,所以我编辑了csproj文件,在参考include中专门调出了本地副本的版本号。这样做之后,VS 选择了正确的文件:

<Reference Include="My.Annoying.Library, Version=1.0.6.0">

【讨论】:

    【解决方案2】:

    Visual Studio 2017 使用旧的 Nuget 包而不是程序集参考

    您可以使用项目引用而不是使用 NuGet。

    正如您评论的那样,如果引用的项目被频繁修改,我们必须重新构建它,重新创建 nuget,每次修改都将其重新发布到 Nuget 服务器,并且必须将该 nuget 包重新安装到引用的项目中.那会带来很多无聊的工作。为了解决这个缺点,项目到项目的引用应该是一个更好的方法。

    您可以查看this thread 了解更多详情。

    【讨论】:

    • 对不起,如果我不清楚,这些都在单独的解决方案中。
    • 您可以使用 File > Add > Existing Project... 将项目 My.Common 添加到多个解决方案中,或者您可以将 My.Common.cs 添加为多个解决方案的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多