目录
1 程序集的基础知识
1.1 程序集的生成与使用
“程序集(Assembly)”是 .NET Framework 中基本的软件模块,它可以包含数目不限的类型,其载体为一个或多个 DLL 文件,也可以是一个可独立执行的 EXE 文件。
一个项目如果需要使用特定程序集中的类型,需要添加对此程序集的 “引用”。
新建一个解决方案。此解决方案包含两个项目,MyDLLAssembly 是一个类库项目,其中定义了两个类:MyPublicClass 和 MyInnerClass,而UseMyDLLAssembly 则是一个控制台项目。
示例解决方案编译完成之后,生成两个程序集 MyDLLAssembly.dll 和 UseMyDLLAssembly.exe,其中 UseMyDLLAssembly.exe 需要引用 MyDLLAssembly.dll中的类型。
DLL/EXE 文件是程序集与命名空间的物理载体。
1.2 程序集的内部结构
1、程序集中包含项目所有源码编译生成的IL代码,这些代码完成特定的功能,在程序运行时将会被即时(Just-In Time,JIT)编译为本地代码(Native Code)。
2、程序集中必须要有一个类型清单,向外界说明 “我拥有多少个类,每个类有哪几种方法和字段” 之类的信息,这个清单被称为 “类型元数据(Type Metadata)”。
3、除此之外,当源码中要访问的某图片文件和字符串常量,也可以嵌入程序集中,这部分数据被称为 “资源(Resources)”。
元数据在 .NET Framework 中有很重要的作用。正式由于元数据的存在,使程序集成为了 “自说明的(Self-Description)”,即不再需要其他机制(比如注册表)帮助,自身就向外界提供了足够的信息。
2 程序集与组件化开发
2.1 组件的概念
所谓 “组件(Component)”,是指可以用于重用、发布和部署的软件模块。在 Win32 平台之上,这种组件规范称为 “COM(Component Object Model,组件对象模型)”,遵循 COM 规范开发出来的组件称为 COM 组件。
.NET 提供了一个全新的组件化模型,新的模型将组件统一为一种类型,即程序集(Assembly),.NET 平台上的组件化开发是基于程序集的。
注:在 .NET 中,一个程序集就是一个组件,组件的接口体现为组件中声明为 public 类型的共有成员,包括字段、方法、属性和事件。
2.2 组件化开发方法及步骤
组件化开发的基本方法如下:
(1)重用已有组件;
(2)开发部份新组件
(3)组合新旧组件搭建出新系统。
在整个开发过程中,组件的接口是关键。必须精心设计组件的接口,以方便地在多个项目中重用组件。
如图所示,在开发某一应用程序时,组件1自行开发,组件2向第三方软件公司购买,组件3与组件4功能相同,但实现不同。
2.3 组件化开发中的组件依赖性
在示例解决方案中,UseDLL项目要添加对 MyDLL 和 MyDLL2 两个程序集的引用,这就在UseDLL 组件与 MyDLL、MyDLL2 两个组件间建立了一个依赖关系。
由于组件的依赖关系,因此在编译解决方案时会有一个编译顺序的问题,原则上按照以下规则确定编译顺序:
先编译只被别人依赖,而不依赖别人的组件;之后,引用这些组件的其它组件就可以成功编译了。
同时在大型软件系统开发中,要注意组件的依赖性问题,要尽量避免出现循环依赖的情况。
当我们尝试两个组件相互引用时,会造成一个组件的循环依赖,Visual Studio 报告一个循环引用错误。
3 互操作程序集与本地类型
3.1 .NET 互操作程序集
在 .NET 出现之前,COM 是 Win32 平台的核心技术之一。
COM 组件最大的特点在于它可以方便地被组合到各种 Windows 应用程序中。如果 COM 组件是 DLL 形式的,它运行在调用此 COM 组件的进程的地址空间中;如果 COM 组件是 EXE 的,则它运行在自己独立的地址空间中,通过进程间通信相互传送信息。
微软 Office 软件包中的 Word、Excel 等都是 COM 组件,可以接收其它进程发送的命令以完成特定的工作。在这种情况下,我们称 Word 等 COM 组件为 “COM服务器(COM Server)”,称向 Word 等 COM 服务器发送命令的程序为 “ COM 客户端(COM Client)”。
在 .NET 应用程序中,可以使用 “互操作程序集” 调用 COM 组件:
要在 .NET 这个 “托管世界” 里调用 “非托管世界” 中的 COM 组件,我们必须通过一个中间的 “互操作程序集(Interop Assembly)” 作为桥梁,此程序集保存了与 COM 组件中各种类型对应的 .NET 类型。
注:“互操作程序集” 确定了 .NET 中的类型与 COM 组件中的类型之间的对应关系。