C#:构建后在程序集清单中声明了哪些 Dll
C#: which Dlls are declared in the assembly manifest after the build
当我构建一个引用许多项目的 C# 项目时,我得到了我的 dll 输出。
我用 DotPeek 打开它以查看其引用,但我发现有些项目引用不存在。
我的问题是:编译器如何决定将引用放入程序集中?
有几种情况会在编译 A 时删除从项目 A 到项目 B 的引用:
- 您引用了 B,但您没有以任何方式使用 B 的任何内容
- 您引用了 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;
}
}
当我构建一个引用许多项目的 C# 项目时,我得到了我的 dll 输出。 我用 DotPeek 打开它以查看其引用,但我发现有些项目引用不存在。
我的问题是:编译器如何决定将引用放入程序集中?
有几种情况会在编译 A 时删除从项目 A 到项目 B 的引用:
- 您引用了 B,但您没有以任何方式使用 B 的任何内容
- 您引用了 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;
}
}