gpt4 book ai didi

visual-studio - 未从引用的项目复制 NuGet 包

转载 作者:行者123 更新时间:2023-12-03 21:28:37 28 4
gpt4 key购买 nike

我有一个非常奇怪的错误,我无法解释。

所以我的设置非常简单:

我有一个包含 2 个项目的解决方案,让我们将它们命名为 ProjectA 和 ProjectB。
ProjectA 引用了一些 NuGet 包,如果我构建 ProjectA,我可以在输出目录 bin 文件夹中看到所有程序集。
ProjectB 现在引用 ProjectA,但如果我构建 ProjectB,输出目录中有 ProjectA 程序集,但没有从 ProjectA 引用的 NuGet 包。

从 ProjectB 到 ProjectA 的引用是通过 References -> Add Reference... -> Solution -> ProjectA 添加的。

我还创建了一个涵盖这种情况的小测试项目,但它在我的测试项目中运行良好。

有任何想法吗?

最佳答案

解释

对于示例场景,假设我们有项目 X、程序集 A 和程序集 B。程序集 A 引用程序集 B,因此项目 X 包含对 A 和 B 的引用。此外,项目 X 包含引用程序集 A 的代码(例如 A. SomeFunction())。现在,您创建一个引用项目 X 的​​新项目 Y。

所以依赖链看起来像这样: Y => X => A => B

Visual Studio/MSBuild 试图变得聪明,只将引用引入到项目 Y 中,它检测到项目 X 需要它;它这样做是为了避免项目 Y 中的引用污染。问题是,由于项目 X 实际上不包含任何显式使用程序集 B 的代码(例如 B.SomeFunction()),VS/MSBuild 没有检测到 B 是必需的通过 X,因此不会将其复制到项目 Y 的 bin 目录中;它只复制 X 和 A 程序集。

解决方案

您有两种选择来解决这个问题,这两种选择都会导致程序集 B 被复制到项目 Y 的 bin 目录中:

  • 在项目 Y 中添加对程序集 B 的引用。
  • 将虚拟代码添加到使用程序集 B 的项目 X 中的文件中。

  • 我个人更喜欢选项 2,原因有几个。
  • 如果您将来添加另一个引用项目 X 的​​项目,您将不必记住还包含对程序集 B 的引用(就像您必须使用选项 1 那样)。
  • 您可以有明确的评论,说明为什么需要存在虚拟代码而不是将其删除。因此,如果有人不小心删除了代码(比如使用查找未使用代码的重构工具),您可以轻松地从源代码管理中看到代码是必需的,并可以恢复它。如果您使用选项 1 并且有人使用重构工具清理未使用的引用,则您没有任何评论;您只会看到从 .csproj 文件中删除了一个引用。

  • 这是我遇到这种情况时通常添加的“虚拟代码”示例。
        // DO NOT DELETE THIS CODE UNLESS WE NO LONGER REQUIRE ASSEMBLY A!!!
    private void DummyFunctionToMakeSureReferencesGetCopiedProperly_DO_NOT_DELETE_THIS_CODE()
    {
    // Assembly A is used by this file, and that assembly depends on assembly B,
    // but this project does not have any code that explicitly references assembly B. Therefore, when another project references
    // this project, this project's assembly and the assembly A get copied to the project's bin directory, but not
    // assembly B. So in order to get the required assembly B copied over, we add some dummy code here (that never
    // gets called) that references assembly B; this will flag VS/MSBuild to copy the required assembly B over as well.
    var dummyType = typeof(B.SomeClass);
    Console.WriteLine(dummyType.FullName);
    }

    关于visual-studio - 未从引用的项目复制 NuGet 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19527284/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com