C#:构建后在程序集清单中声明了哪些 Dll

C#: which Dlls are declared in the assembly manifest after the build

当我构建一个引用许多项目的 C# 项目时,我得到了我的 dll 输出。 我用 DotPeek 打开它以查看其引用,但我发现有些项目引用不存在。

我的问题是:编译器如何决定将引用放入程序集中?

有几种情况会在编译 A 时删除从项目 A 到项目 B 的引用:

  1. 您引用了 B,但您没有以任何方式使用 B 的任何内容
  2. 您引用了 B,并且只在 B 中使用了常量

在第一种情况下,引用被证明是不必要的,所以它没有被编译到 A 中。

在第二种情况下,常量值被编译到 A 而不是对 B 中常量的引用,因此现在不需要对 B 的引用,因此它不会被编译到 A。

如果您创建两个项目,A 和 B,并从 A 引用 B,并添加这些类型:

namespace A
{
     public class AClass
     {
         public int Field = B.BClass.Constant;
     }
}

namespace B
{
     public class BClass
     {
         public const int Constant = 42;
     }
}

然后编译这个并反汇编 A 程序集你会看到没有对 B 的引用的痕迹,A.AClass 的编译代码如下所示:

namespace A
{
     public class AClass
     {
         public int Field = 42;
     }
}