COM和.NET的互操作

.NET Framework的产生已经有两年多的时间了,有不少公司开始采用.NET开发应用软件。但是很多公司在多年的项目应用中,开发了很多COM、DCOM组件,现在采用.NET开发组件,使这些组件成为了遗留代码。由于在开发COM组件时投入了大量的人力、财力,如何在.NET环境下重用这些COM组件就显得更有意义,本文将介绍使这些COM组件“起死回生”的方法。

.NET支持运行时通过COM、COM+、本地WinAPI调用与未管制代码的双向互操作性,BCL为此提供了一套类和属性,包括受管制对象生存期的精确控制等。要实现互操作性,必须首先引入.NET Framework的 System.Runtime.InteropServices命名空间。C#的语法为:

using System.Runtime.InteropServices;

而VB.NET的语法为:

import System.Runtime.InteropServices

.NET访问API

.NET允许C#访问未管制的DLL的函数。如要调用Windows User32.dll的MessageBox函数:

int MessageBox(HWND hwnd,LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)

可以声明一个具有DLLImport属性的static extern方法:

using System.Runtime.InteropServices;

[DllImport(“user32.dll”)]

static ertern int MessageBox(int hwnd,string text,string caption,int type);

然后在代码里面直接调用就可以了。这里要注意在调用返回字符串的API中使用StringBuilder对象。

.NET访问COM组件

从.NET调用COM组件比较容易,只要使用tlbimp.exe产生COM的装配形式的WarpClass,然后在.NET项目中调用即可。

注意COM的类型信息通过Type Library文件描述,.NET装配件是自描述的。Tlbimp的作用是从COM组件及其类型信息中产生自描述的装配件。由于VB是进行COM组件开发最简单的语言,所以我们以一个简单的VB COM组件来说明。

1.编写VB组件

VB组件原码(文件名CoAccount.cls)如下:

Private m_Balance As Integer

’组件的私有成员变量

Public Sub Deposit(sum As Integer)

’存钱的方法

m_Balance = m_Balance + sum

End Sub

Public Property Get Balance() As Integer

’属性Balance访问成员变量m_Balance

Balance = m_Balance

End Property

将上述代码编译生成CoAccount.dll。

2. 产生.NET可访问的包装类(assembly),使用TlbImp.exe产生.NET装配件。

TlbImp /out:NetAccount.dll CoAccount.dll

3.在.NET代码中访问

.NET代码只需引用CoAccount.dll,就可以像访问.NET的装配件一样访问COM组件。

将.NET组件转化为COM组件

因为.NET装配件开发效率较高,先在.NET环境下开发装配件,然后转化为COM组件,由VB、ASP等调用,可以加快开发进度。下面我们用一个例子简单阐述一下整个过程。步骤如下:

1.定义接口

COM是通过抛出接口让外部应用调用的,每个接口、组件都有一个GUID,在.NET中开发COM组件也不例外。

[Guid(“18E2BCAF-F4B5-4031-8F84-FCFB1DC04877”)] //接口GUID

public interface IAccount

//定义接口IAccount

{ [DispId(1)]

//每个方法或属性都具有DISPID属性,是为了让VBScript等脚本语言调用

void deposit(int num);

//方法,实现存钱的功能

[DispId(2)]

int Balance

//属性,查看当前的账户余额,只读。请注意.NET下属性的定义方法

{ get; }

}

2.实现接口的派生类

[Guid(“9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E”), //组件的GUID

ClassInterface(ClassInterfaceType.None)]

//指明组件的调用方式,支持后期绑定

public class NetAccount:IAccount

//实现接口派生类,注意派生类要实现接口的所有方法。

{ private int balance;

//组件的私有成员变量(在.NET中称为域(FIELD))

public NetAccount()

//构造函数,初始化成员变量

{ balance=10; }

public void deposit(int num)

//实现存钱方法。

{ balance+=num; }

public int Balance

//实现Balance属性,通过它访问成员变量

{ get

{ return balance; }

}

}

3.将.NET私有装配件转化成公有装配件

.NET下对装配件的调用,实际上是拷贝到调用应用程序的本地目录,称为私有装配件。要转化为COM组件,首先要转化为公有装配件,也就是放到GAC里。

(1) 创建强名字

为了使COM对象能够被外部对象调用,类库组合必须有一个强名字。创建强名字需要用到SN.EXE,语法为:sn -k account.snk, 然后将强名字拷贝到debug目录下。打开AssemblyInfo.cs,并修改下面一行的内容:

[assembly: AssemblyKeyFile(@“account.snk”)]

(2) 将装配件转入GAC

编译项目文件产生NetAccount.dll文件,使用GacUtil.exe装入GAC:

gacutil -i NetAccount.dll

(3) 注册装配件

在注册表里面注册装配件,允许COM组件的客户调用,也可以生成注册表文件,以备将来调用。

RegAsm NETAccount.Dll

执行上述语句,则装配件可以被脚本语言调用。

(4) 导出类型库

为了可以在VB里面使用组件,必须使用tlbexp.Exe导出COM类型库。

Tlbexp /out:NetAccount.tlb NetAccount.dll

经过上面的工作,就将一个.NET装配件转化为COM组件。需要注意的是:在COM中调用.NET对象需要具备以下条件:

● 类必须是public性质;

● 特性、方法和事件必须是public性质的;

● 特性和方法必须在类接口中定义;

● 事件必须在事件接口中定义。

(计算机世界报 第43期 C17、C18)

时间: 2024-09-08 16:49:55

COM和.NET的互操作的相关文章

Web服务互操作开发的十大要点

web|web服务|web服务   Web服务互操作开发的十大要点 在过去一段时间里,很多供应商纷纷以惊人的速度发布其Web服务的实现.这包括产品的主要版本.辅助版本和许多开发服务包.随着新版本越来越符合标准,不同供应商之间的互操作性越来越高. 尽管如此,仍然需要在共同使用这些Web服务时的建议和策略.有些实践允许您确保以互操作的方式既使用又公开Web服务.基于已有的经验,我整理了关于Web服务互操作性的"十大"要点列表.有些要点基于在Microsoft上运行的测试结果的发现,另外一些

利用ODBC实现Domino和关系数据库的互操作

dom|odbc|数据|数据库 利用ODBC实现Domino和关系数据库的互操作 Lotus Domino是当今办公自动化系统的主流开发平台之一,Domino自带一个非关系型数据库--文档型数据库,而目前大部分企业的信息都储存在诸如SQL Server等关系型数据库中,因此,在开发办公自动化系统过程中势必要涉及Domino和关系数据库的数据交换问题. 一.Lotus Domino与关系数据库的互操作 在Lotus Domino R5中提供了三个Lotus Notes扩展类:ODBCConnect

COM与.NET的互操作(初级)

COM与.NET的互操作(初级)COM与.NET的互操作中从.NET调用COM组件,如果使用VS.NET将变得非常容易,你只需要在你的工程中,添加对应的COM引用,编译工具就在后台悄悄的把COM"变成"了.NET程序集.而从传统的语言调用调用.NET组件却不如那么方便了.所以,我整理了个人调试成功的几段程序希望对大家有一些帮助,好了废话少说进入正题. 一,从vbscript等脚本调用.net组件 首先我们可以写一个.NET dll如下 //the first file:netServe

Silverlight和Java的互操作

摘要 本文针对那些希望把Silverlight集成到解决方案中的Java社区开发人员,给出了一些入门指导.微软 Silverlight是一个跨浏览器.跨平台和跨设备的浏览器插件,旨在设计.开发和发布下一代多媒体体验与富 交互(rich interface application)的网络应用程序. 本文同时也介绍了Silverlight的一些背景知识,其基 本功能和开发理念:介绍了在开发支持多种媒体的富客户端应用时如何合理定位Silverlight:还介绍了 Silverlight的架构,优点及其

Flex与JSON及XML的互操作

Flex之于Java,就像美丽之于大脑,或者还有别的说法?谁能告诉我?我所知道的是,Flex和Java真的是能配合得很好,能创建出难以置信 的富 Internet应用(RIA).你会问Flex是什么?Flex是一个开源框架,你可以通过基于标签的MXML语言(以及ActionScript 3)来构建Flash 应用. 请观看:Jack有关Flex与JSON及XML互操作的演讲 (QuickTime格式,33MB). http://www.jackherrington.com/screencasts

Flex与.NET互操作(十五)

Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传 前几天一位朋友问我一个问题,他说:"我用HTTP接口或是WebService接口可以实现图片上传功能,那么用FluorineFx如何实现图片 上传功能呢?",其实仔细看官方文档和示例程序的自己都可以找到答案,实现上传可以有很多种实现,这里我以官方所提供是示例为基 础稍加改动,通过ByteArray类实现图片上传. 首先建立FluorineFx库和网站,在远程服务器类里添加一个处理文

Flex与.NET互操作(十二)

Flex与.NET互操作(十二):FluorineFx.Net的及时通信应用(Remote Shared Objects)(三) 远程共享对象(Remote Shared Objects) 可以用来跟踪.存储.共享以及做多客户端的数据同步操作.只要共享对象上的数据发生了改变 ,将会把最新数据同步到所有连接到该共享对象的应用程序客户端.FluorineFx所提供的远程共享对象(Remote Shared Objects)和FMS的共享 对象的功能是一样,对于熟悉FMS开发的朋友来说,学习Fluor

Flex与.NET互操作(十)

Flex与.NET互操作(十):基于FluorineFx.Net的及时通信应用(Real-time Messaging Applications)(一) 使用FluorineFx.Net开发的每一个实时通讯功能应用都拥有一个应用程序适配器(ApplicationAdapter),用来管理整个实时通讯应用的生 命周期,以及接受和拒绝客户端的连接等.应用程序适配器对象也就相当于是一个Flash媒体服务器应用程序的对象. 使用 FluorineFx.Net开发及时通信应用,我们可以通过ASP.NET网

Flex与.NET互操作(十一)

Flex与.NET互操作(十一):基于FluorineFx.Net的及时通信应用(Remote Procedure Call)(二) FluorineFx.NET提供了完善的RPC(Remote Procedure Call)功能,无论是通过Flash还是Flex开发的客户端应用(.swf)都可以非常简单方便 的采用RPC的方式调用.NET的服务器端方法,.NET的服务器端同样也可以非常方便的呼叫客户端,调用客户端的方法(比如实现系统广播). 一.客户端的RPC(客户端调用服务器端) 要想实现客

Flex与.NET互操作(九)

Flex与.NET互操作(九):FluorineFx.NET的认证(Authentication )与授权(Authorization) FluorineFx.NET的认证(Authentication )与授权(Authorization)和ASP.NET中的大同小异,核实用户的身份既为认证,授权则是确定一个用 户是否有某种执行权限,应用程序可根据用户信息授予和拒绝执行.FluorineFx.NET的认证和授权使用.Net Framework基于角色的安全性的支 持. 比如说我们需要自定义一个