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

时间:2015-10-28 12:56:20

标签: c# reflection .net-assembly

当我构建一个引用很多项目的C#项目时,我会在输出中输入我的dll。 我用DotPeek打开它以查看它的引用,我得到一些项目引用不在那里。

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

1 个答案:

答案 0 :(得分:4)

有些情况下,在编译A时,项目A到项目B的引用被删除:

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

    在第一种情况下,参考证明是不必要的,因此它不会被编译成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;
         }
    }