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

时间:2018-05-17 19:12:22

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

我有一个我正在开发的公共图书馆。我们称之为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。该bug会影响应用程序直接使用的功能 - 它对其他库没有影响,它们可以继续使用版本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似乎根本无法找到程序集 - “属性”中的路径为空白,并且应用程序填充了&#34;(您是否缺少程序集引用?)&#34;错误。

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

如何让Visual Studio实际使用本地程序集引用?

2 个答案:

答案 0 :(得分:0)

  

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

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

正如您评论的那样,如果引用的项目经常被修改,我们必须重建它,重新创建nuget,将其重新发布到Nuget服务器以进行每次修改,并且必须将该nuget包重新安装到引用的项目。这将带来许多无聊的工作。要解决这个缺点,Project-to-project引用应该是更好的方法。

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

答案 1 :(得分:0)

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

还原NuGet软件包后,将在解决方案的obj文件夹中生成package.assets.json文件。来自文档here

  

在构建之前运行NuGet还原过程时,它可以解决   依赖关系首先在内存中,然后将结果图写入   使用以下命令在项目的obj文件夹中名为project.assets.json的文件   PackageReference。 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,而是采用了package.assets.json中提供的路径,该路径由另一个NuGet软件包使用。

我要做的是也删除对另一个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">
相关问题