组件与.NET互操作

时间:2022-09-15 23:41:19

组件

1、何谓组件技术?

组件技术就是利用某种编程手段,将一些人们所关心的,但又不便于让最终用户去直接操作的细节进行了封装,同时对各种业务逻辑规则进行了实现,用于处理用户的内部操作细节,甚至于将安全机制和事物机制体现的淋漓尽止。而这个封装体就常常的被我们称作组件。

2、组件有什么作用?

这个问题似乎有些笼统,试着想一想windwos何以实现如此强大的生产力?而在它的背后到底有什么在服务着?

一句话:组件就是windows的灵魂,脱离了组件,windows系统将不再如今天一样如日冲天,windows如此,Unix也同样是如此,作为一个操作系统,它所完成的功能无不体现着组件的服务,一个很轻松的Copy– Paster都要靠DDE来支持,而DDE就是一种组件服务对象,而具体到某一个细节,

组件有其自身的规则实现,而规则的实现又体现了接口的实现,但是组件对象本身也是一个组件,它也有业务逻辑规则需要处理,它也要起到所集合的组件的协调。如此一来,可以能过某一个组件对象来协调的实现一些、一部分的业务逻辑规则!而对于应用者来说,这一切完全没有必要去得知,甚至是没有意义的

3、为什么要应用组件技术?
使用组件技术的的目的是实现各种规则的实现,而且组件对象还将从更广阔的方面来考虑,它能将一个大型的分布式系统进行统一的规划、合理的处理冗余、安全、平衡负载……等单纯的编程手段不能实现的功能,这就是我们要应用组件的一个很重要的原因。再者,组件对象不是普通的可执行文件,更不是将各种规则定死在其内部,它可以很平滑的实现自身的升级、扩展。

组件(component)技术是各种软件重用方法中最重要的一种方法,也是分布式计算和Web服务的基础。网络应用中的软件组件,又被称为中间件middleware)。



组件技术的应用现在已经十分广泛,从Windows编程中使用的各种控件和公用对话框,到ActiveX控件和DirectX的应用;从微软公司的COM,到Sun公司的JavaBean。其中最流行的组件技术的应用是——客户端的VBX(微软/VB)和服务器端的EJBSun/Java)。

在网络及其应用都很发达的今天,对组件服务的需求十分强烈,因此组件技术近年来得到了飞速的发展和广泛的应用。

概述

面向过程的编程重用函数、面向对象的编程重用类、范型编程重用的是算法的源代码,而组件编程则重用特定功能完整的程序模块

每个组件会提供一些标准且简单的应用接口,允许使用者设置和调整参数和属性。用户可以将不同来源的多个组件有机地结合在一起,快速构成一个符合实际需要(而且价格相对低廉)的复杂(大型)应用程序。

组件区别于一般软件的主要特点,是其重用性(公用/通用)、可定制性(设置参数和属性)、自包容性(模块相对独立,功能相对完整)和互操作性(多个组件可协同工作)。可以简单方便地利用可视化工具来实现组件的集成,也是组件技术一个重要优点

组件在某些方面类似于可执行程序,在另一些方面又类似于

组件标准

组件应用的基础是标准,没有统一的接口描述、没有规范的组件通信、没有标准的对象请求和远程调用,就没有组件应用的可能。目前的主要标准有CORBA(国际通用)、EJBSunJava)、COMCLRMicrosoftWindows.NET)。

这里主要说一下COMCLR

3COM / .CLR

COMComponent Object Model组件对象模型)是微软公司于1993年提出的一种组件技术,是软件对象组件之间相互通信的一种方式和规范,它是一种平台无关、语言中立、位置透明、支持网络的中间件技术

COMOLEObjectLinking and Embedding对象链接和嵌入)的发展(而OLE又是DLL [Dynamic LinkLibraries动态链接库]的发展),DCOMDistributed COM分布式COM1996年)和COM+DCOM+管理,1999年)则是COM的发展。ActiveX控件COM的具体应用(如VBXDirectX都是基于ActiveX的)。ATLActive Template Library活动模板库)是开发COM的主要工具,也可以用MFC来直接开发COM,但是非常复杂。

作为组件技术的进一步发展,微软公司又于2002年推出了.NET框架,其中的核心技术就是用来代替COM组件功能的CLRCommon Language Runtime公共语言运行库),可采用各种编程语言,利用托管代码来访问(例如C#VBMC++),使用的是.NET的框架类库FCLFrameworkClass Library
微软公司的各种组件技术之间的关系与发展可以参见下图:

组件与.NET互操作

下面分别对这几种组件技术加以简单的介绍:

1DLL

DLLDynamic Link Libraries动态链接库)还不能算组件技术,但它是软件重用的鼻祖。

DLL采用动态链接,对公用的库函数,系统只有一个拷贝(位于系统目录的*.DLL文件),而且只有在应用程序真正调用时,才加载到内存。在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。
由于应用程序是通过系统来调用动态链接库的,因此每个DLL都有一个类似于main的入口函数。在DLL中,供外部应用程序调用的库函数叫做导出函数,而只是被DLL内部调用的库函数则叫做内部函数。导出函数在客户端叫做导入函数。

2)OLE

OLE(Object Linking and Embedding对象链接和嵌入)是微软公司于1991年推出的一种简单的组件技术,它允许Windows中的程序相互之间进行合作——一个(客户)程序调用另一个(服务器)程序,以完成特定的功能。而且客户/主程序的界面不变,就似将服务器程序嵌入到客户程序中一样。

3COM

OLE 1.0实际上只是一种复合文档,而OLE 2.0已经具有标准组件的特性了,显然它是受了CORBA的影响。所以从OLE 1.0到OLE 2.0,是微软公司在组件技术上的一次飞跃。这时,OLE的名称就有一些名不副实了,因此,在增加了一些功能和规范之后,微软公司于1993年在OLE 2.0的基础上又推出了COM,用来替代原有的OLE。这样一来,OLE就不再是一种独立的组件技术,而只是COM技术在链接和嵌入方面的一个具体应用。而1996年3月推出的ActiveX控件,也只是COM的一个具体应用,它是用来替代原有的VBX控件的。

COM(Component Object Model组件对象模型)的核心是一组组件对象间交互的规范,它定义了组件对象如何与其使用者通过二进制接口标准进行交互,COM的接口是组件的球类型纽带。

除了规范之外,COM还是一个称为COM库的实现,它包括若干API函数,用于COM程序的创建。

4DCOM

DCOMDistributed COM,分布式COM)是COM的网络化。COM具有进程透明性,组件对象和客户代码不必考虑调用传递的细节,只须按照普通函数方式进行调用即可。而DCOMCOM的进程透明性扩展为位置透明性,形成分布式的组件对象模型。

5COM+

COM+COM-based services and technologies(基于COM的服务与技术)的简称,+表示将COM组件技术和MTSMicrosoft Transaction Server微软事务服务器)应用程序主机技术结合在一起。它是一个面向应用的高级COM运行环境,它在COM基础上实现了许多面向企业应用的分布式应用程序所需要的服务。COM+1999年随Windows 2000推出的。

6.NET / CLR

.NET的核心是CLR,它可以视为是COM技术的继承和发展,它解决了COM组件模型中存在的主要问题

组件与.NET互操作

COMCLR过渡

鉴于COM技术已经被使用多年,有许多现存的资源,程序员和用户也不可能一下子就全部完全转换到.NET环境。因此,微软公司也允许在CLR环境中继续使用COM/DCOM/ COM+DNA,这可以通过.NET框架的System.EnterpriseServices命名空间来进行。

但是鉴于与COM相比,CLR组件所具有的无比优越性。COM技术必然会走向灭亡,而.NETCLR终将取而代之。

整理自:组件技术介绍


.net互操作

      相对于COM技术,.NET技术就是为基于组件的程序设计而生的,所以其编码效率和语言可读性要高出COM一个等级。但是由于1993年以后的十多年时间里,人们利用基于COM的组件程序设计技术开发了大量的高复杂度,高可用性的代码,并且他们运行良好,效率极高,如果用.NET技术重写这些代码简直就是得不偿失,加之在.NET的实现过程中并不是所有的Windows API都被重写,有些功能是.NET所不能完成的。面对这样的问题, .NET互操作技术应运而生,可见需求才是技术的原动力。

.NET互操作性入门系列(一):.NET平台下互操作性介绍

.NET互操作性入门系列(二):使用平台调用调用Win32函数

.NET互操作性入门系列(四):在C#中调用COM组件

托管代码与非托管代码

托管代码    (managed code)
         同受管制的代码,由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
        托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware compiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。
优点:
在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如  类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用 逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。
简单点说, 托管代码是一microsoft的中间语言 ,他主要的作用是在.NET FRAMEWORK的CLR执行代码前去编译 源代码 ,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:
1.源代码编译为托管代码;(所以源代码可以有很多种,如VB,C#,J#)
2.托管代码编译为microsoft系统的.net平台专用文件(如类库、 可执行文件等)。

非托管代码(unmanaged code)
托管代码 必须提供自己的 垃圾回收 、类型检查、安全支持等服务,它与托管代码不同,后者从 公共语言运行库 中获得这些服务,而非托管代码是在运行库之外运行的代码。例如 COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例 非托管代码调用的是Windows系统库 和MFC库