主项目的输出文件夹中缺少Nuget库的引用。

4
假设我有三个.NET 7.0项目:
1. Project A(类库)具有Nuget依赖项 2. Project B(控制台应用程序)具有对Project A的瞬态引用 3. 主要项目(控制台应用程序),它具有对Project A的瞬态引用和对Project B的直接引用
所有项目都是一个解决方案的一部分。当我构建解决方案时,会发生以下情况:
1. Project A不会将任何Nuget库复制到bin文件夹中。 2. Project B会复制由Project A引用的库。 3. 主要项目不会复制Nuget库。
主要项目不复制库会给我带来问题,因为它对于Project B的可执行文件正常运行是必需的(带有其DLL程序集的可执行文件存在于输出文件夹中)。我花了近三天的时间尝试让它正常工作,但没有成功。
我无法弄清楚为什么行为差异如此之大。对于这个问题有什么见解吗?感激不尽。
已尝试:
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

在项目属性中。对于A项目有效,但由于某些原因无法与主项目一起使用。

我很想看到这个问题的任何答案。在某些情况下,我们不得不将NuGet包添加到叶子程序集(例如您的主项目)中来解决这个问题。 - Matthew Watson
我也尝试过,但出于某种原因,Nuget程序集也没有被复制,即使我试图强制复制它。可能是因为MSBuild认为它不必要? - Paar
1个回答

0

“瞬态引用”是否意味着项目引用(添加->项目引用),而“直接引用”是否意味着直接引用项目B生成的.dll文件?

如果是这样,那就很奇怪了。我尝试将自定义包引用(NuGet包)添加到ProjectA中,并尝试从nuget.org添加随机NuGet包引用到ProjectA中。场景一和场景二是相同的,但主项目确实复制了NuGet库(.dll文件)。您能否在新创建的三个项目上重现此问题?

我建议首先确认“ProjectReference”已添加到MainProject.csproj文件中,例如(在MainProject的.csproj文件中):

<ItemGroup>
  <ProjectReference Include="XX\XXXX\ProjectA.csproj" />
</ItemGroup>

如果上述的 XML 代码行没有添加,请在 <Project></Project> 之间添加它们。如果 MainProject.csproj 文件中有一些特殊或自定义配置,请仔细检查并确保它们不会阻止 MainProject 引用 ProjectA,并且不会从输出/目标文件夹中删除任何文件,例如 NuGet 库。

如果任何缓存或 VS 设置影响并导致此问题,请尝试重命名解决方案文件夹中的隐藏 .vs 文件夹,删除项目文件夹中的 bin 和 obj 文件夹。考虑重置 VS 设置(在“Visual Studio 2022 开发人员命令提示符”中运行 devenv /ResetSettings)和修复 VS(VS 安装程序 > 更多 > 修复)。

由于您提到“即使强制执行,NuGet 程序集也不会被复制”,为了双重确认并作为临时解决方法,请尝试直接在 MainProject.csproj 文件中编写一个目标,并将 NuGet 库复制到目标文件夹中。

<Target Name="CopyFiles" AfterTargets="Build">
   <Copy
        SourceFiles="XX\XXXX\XXXX\XXX.dll"
        DestinationFolder="XX\XXXX\XXXX"
    />
</Target>

另外,请前往“工具”>“选项”>“项目和解决方案”>“生成和运行”>“MSBuild 项目生成输出详细程度”,将选项设置为“详细”,然后重新构建您的项目。在重新构建解决方案后,检查 VS 输出窗口,并告诉我们是否看到任何错误/警告,例如无法复制 NuGet 库/忽略复制 NuGet 库/删除 NuGet 库...

感谢您的输入。我所说的“瞬态(transient)”引用实际上是“传递性(transitive)”,只是选错了词。意思是间接引用某个东西。 我尝试了您提出的所有建议,但都没有帮助。最终,我只是使用您最后代码片段中的“Target”元素来复制DLL文件。 - Paar
我仍无法重现此问题,我是否漏掉了某些步骤?另外,我想知道在您的三个新创建的项目中是否可以再现此问题? - Tianyu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接