1.3 加载公共语言运行库
VS中类库项目可以单独运行吗?
“我们构建的每个程序集可以是一个可执行应用程序,也可以是一个DLL”。
我记得以前写类库的时候,用VS2005新建一个ClassLibrary,比如说写一个字符串处理的辅助类StringHelper。写好以后要调试的时候就犯愁了,类库是不能单独运行的呀,所以我又增加一个控制台程序,然后引用这个类库来进行调试。
实际上,类库和EXE的唯一区别是有没有Main函数。我们新建一个ClassLibrary,然后在Class1中增加main函数,它其实就变成了一个应用程序。
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace ClassLibrary1
6 {
7 public class Class1
8 {
9 public static void Main(string[] args)
10 {
11 }
12 }
13 }
然后F5开始运行,出现一个错误提示:
这个错误并不是程序的错,而是编译的错,既然 “我们构建的每个程序集可以是一个可执行应用程序,也可以是一个DLL”,就应该要告诉编译器,我们是要把这个项目编译成dll还是exe,因此在项目属性->application->Output type中选成Console Application就行了。
我刚刚知道能这么用的时候觉得异常惊讶,原来VS里那么多项目类型都是蒙人的,我原来以为完全不同的东西(windows应用程序,控制台应用程序和类库)原来差别如此之小。看来可视化编程的方式有时确实会起到误导的作用。实际上EXE和DLL文件都是PE格式。
我们可以使用VS自带的调试工具,Modules窗口查看一下这个程序的进程中的模块。
我们看到里面有两个EXE模块。我们在任务管理器中查看进程的时候,一个进程好像总对应一个EXE文件。但是为什么这里有两个呢?
一个进程就像一列火车,只有EXE能做火车头。
一个进程中包含很多模块,这非常象一列火车,EXE是火车头,DLL是车厢。只有火车头才能带动火车开动,但是,一列火车可以有多个火车头吗,当然可以。在这个例子当中,火车头其实是ClassLibrary1.vshost.exe,而ClassLibrary1.exe虽然是个火车头,在这里充当了第一节车厢。
PE文件格式就像一本书
一个项目总是包含很多源代码文件,包括资源文件等等,编译程序只是把多个源代码文件编译成了一个程序集文件,也可以说PE格式文件。这有点像把几十篇散文编成一本散文集。实际上,PE格式虽然非常复杂,但是粗略的看起来,PE文件格式非常像书的结构。大致分为三部分,封面前言,目录,内容。
知道这些有啥用?
PE文件格式当然是编译器开发人员,加密解密的基本知识,但是对应用程序开发者有什么用处?
托管程序集也好,win32函数库也好,com也好,都是PE文件格式。我想知道这一点的好处是,我们至少知道,在技术日新月异的背后,总是有些不变的东西,而掌握这些不变的东西,以不变应万变,也许能减少一点对学习新技术的心理压力吧。
详细的PE文件格式文档可到看雪论坛http://bbs.pediy.com/showthread.php?threadid=21932