.NET 程序集深入剖析
1. Web 项目与网站类型
Web 项目是构建网站的一种很好的方式。不过,无程序集类型的网站如果有一个不那么通用的名称会更有帮助,因为说“网站并非构建网站的唯一方式”虽然是事实,但容易让人困惑。
在 Visual Studio 中,除了使用“新建项目”对话框,你还可以选择“文件”→“新建”→“网站”菜单项来创建一个 Visual Studio 所称的“网站”,它与普通的 Web 项目略有不同。这种方式会将所有编译推迟到运行时,这就需要将源代码部署到服务器,类似于旧的 .NET 前 Web 技术 ASP 的做法(ASP 是 ASP.NET 的前身,但实际上它们在技术上并无关联)。不同版本的 Visual Studio 支持不同的项目类型,并且项目系统是可扩展的,所以是否有其他非程序集生成的项目类型取决于系统配置,但总体而言,绝大多数项目的输出是一个程序集。
2. 程序集剖析
程序集使用 Win32 可移植可执行(PE)文件格式,这也是现代 Windows 版本中可执行文件(EXEs)和动态链接库(DLLs)一直使用的格式。C# 编译器通常生成扩展名为 .dll 或 .exe 的文件。理解 PE 文件格式的工具会将 .NET 程序集识别为有效的,但相对普通的 PE 文件。
CLR 本质上将 PE 文件用作 .NET 特定数据格式的容器,因此对于经典的 Win32 工具来说,C# DLL 似乎不会导出任何 API。需要记住的是,C# 编译为二进制中间语言(IL),它不能直接执行。Windows 加载和运行可执行文件或 DLL 中代码的常规机制对 IL 不起作用,因为 IL 只能在 CLR 的帮助下运行。同样,.NET 定义了自