我有一个我正在开发的公共图书馆。我们称之为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实际使用本地程序集引用?
答案 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">