.Net项目总是重新生成,而不是由CopyLocal属性导致的最新版本

ego6inou  于 2023-11-20  发布在  .NET
关注(0)|答案(2)|浏览(140)

无论我做什么,我的.net项目总是会重建。我读了这篇文章https://oz-code.com/blog/visual-studio-keeps-rebuilding-projects-no-good-reason/,我发现我的项目中的CopyLocal问题。
我收到了这个消息:Project 'PROJECTNAME' is not up to date. CopyLocal reference 'D:\...PROJECTPATH...\bin\x64\Debug\System.Net.Http.dll' is missing from output location.
我的System.Net.Http.dll是这样引用的(不要问我为什么Private设置了两次):x1c 0d1x
Visual Studio本身向我展示了它是从“引用程序集”中获取的:

正如我所理解的,从“引用程序集”中获取的程序集永远不会复制到输出文件夹中。
现在的问题是,如果我将CopyLocal更改为false,它可以工作,但在任何NuGet恢复之后,它将再次设置为True。我假设这是由于HintPath引用了一个NuGet包,其中CopyLocal应该设置为True。
它只发生在“System.*”引用中。该项目是.net 4.8,我使用的是最新的VS 2019。
有什么方法可以防止这种情况发生,或者我错过了什么我可以如何解决这个问题?这是发生在一个相当大的解决方案,它需要永远构建,如果一切都是重建所有的时间。
我尝试了ReSharper-Build,这很有效,但如果可能的话,我想坚持标准。
谢谢你的帮助

fnvucqvd

fnvucqvd1#

有什么方法可以防止这种情况发生,或者我错过了什么我可以如何解决这个问题?这是发生在一个相当大的解决方案,它需要永远构建,如果一切都是重建所有的时间。
正如Hans所说,在同一个项目中以不同的方式引用两个system.net.http.dll,这会造成构建混乱,无法确定引用的版本,并且总是需要重新构建。
实际上,System.Net.Http.dll只是Net Framework4.8的一部分,存在于Reference assemblies中。
所有这些都表明这是一个公共的全局DLL,可以直接在VS中使用,而不必使用nuget安装它。所以我很好奇为什么你仍然使用nuget安装它。

备注:当你创建一个新的net frameowrk4.8项目,然后打开reference,你会发现它已经从Reference程序集中引用了system.net.http.dll。所以当你使用nuget安装它或者使用nuget在HintPath中的路径时,它不会改变初始化路径。
解决方案

要解决这个问题,请卸载nuget包System.Net.Http。右键单击项目--> Manage Nuget Packages-->卸载它。
x1c 0d1x的数据
希望能帮到你。

zour9fqk

zour9fqk2#

我对原来的问题和提供的答案已经提供了为什么会发生这种情况的评论
项目中显式包含系统dll
解决这个问题的方法是
删除对系统Dll的特定版本的引用,或者一起删除所有引用
我发现自己处于这种情况。我真的不知道这是如何发生在我的项目,已经发展了7年。但我想分享如何找出你是否在这种情况下旁边的反复重建没有理由。
关键在于OP关于<Private>True</Private>的评论。如果你在.csproj文件中搜索并找到它,那么你可能需要做一些清理工作。这也是一种非常有效的清理方式-通过搜索而不是尝试重复重建直到没有重建发生。(这假设你的解决方案中有很多项目)。
我的方法是在所有文件中搜索<Private>True</Private>,然后对于包含该字符串的每个项目文件,卸载项目并删除引用,然后重新加载项目。
如果在重新加载项目后出现错误,那么需要重新添加删除的引用。但需要以版本无关的方式执行。
例如,我在我的csproj文件中发现了这样的行:

<Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
      <Private>True</Private>
      <Private>True</Private>
    </Reference>

字符串
这将需要替换为

<Reference Include="System.IO" />


一旦你用<Private>True<Private>删除了所有的引用,你就可以开始了。
注意事项:我相信有一个正当的理由为私人=真,我不知道这是什么,但如果你需要它,那么我怀疑你也知道真正的用途是什么,不会盲目地删除它。

相关问题