【发布时间】:2009-10-26 05:09:00
【问题描述】:
我正在学习与 .NET 框架相关的概念。我一度感到困惑。据我了解,编译器 CSC.exe 和 AL.exe 编译文件以基于开关形成程序集。所以我的问题是 1) .NET 框架中的不同编译器以 CLR 为目标。那么这是否意味着单独的文件(代码)和资源文件被编译成一个程序集,并且这个程序集在运行时由 CLR 执行?
2) 当我使用 Visual Studio .NET 时会发生这种情况?
谢谢。
【问题讨论】:
我正在学习与 .NET 框架相关的概念。我一度感到困惑。据我了解,编译器 CSC.exe 和 AL.exe 编译文件以基于开关形成程序集。所以我的问题是 1) .NET 框架中的不同编译器以 CLR 为目标。那么这是否意味着单独的文件(代码)和资源文件被编译成一个程序集,并且这个程序集在运行时由 CLR 执行?
2) 当我使用 Visual Studio .NET 时会发生这种情况?
谢谢。
【问题讨论】:
是的,没错。程序集包含源文件的 MSIL 翻译,CLR 将其转换为机器代码并执行。
当您在 Visual Studio 中选择 Build 命令时,它会运行适合您项目中文件类型的编译器(例如,用于 C# 源文件的 C# 编译器),并生成一个程序集。 (VS 实际上并不执行 csc.exe、al.exe 等;它使用进程内等效项。但结果基本相同。)
【讨论】:
问题 1 的答案是:是的。
问题 2 的答案是 Visual Studio 为您调用编译器并使用您的项目文件为编译器提供创建程序集所需的信息。
【讨论】:
1:差不多;请注意,所有文件必须一起考虑(它们通常不会单独编译然后组合),并且技术上 IL 不是“执行”的(因为它不是本机 CPU 指令);它必须被翻译(由 JIT 或 NGEN)成机器代码,或者在某些平台s(“微框架”)上被解释。但是结果是一样的……
2:相同的进程,除了它不直接调用exes - 它只是直接调用代码。
【讨论】:
命名空间的概念与程序集的概念无关。 单个程序集可能包含层次名称具有不同命名空间的类型
根, 一个逻辑命名空间根可以跨越多个程序集。在 .NET 框架中, 命名空间是一种逻辑设计时命名方便,而程序集建立
名字 运行时类型的范围。
Shrirang Jadhav
【讨论】: