众所周知是基于通用语言运行库创建的也就是所谓的托管执行环境生成的代码称为托管代码编译器能够从源代码的描述中产生元数据信息而运行库又从元数据中获得托管代码的信息而我们编写的组件一般是在非托管环境下创建的这些组件往往不包含元数据信息那么我们怎么在托管代码中使用这些元数据信息呢?
为了在托管环境中使用非托管代码我们首先必须手工为这些现有的组件产生元数据信息必须有一种工具能够产生元数据能够从某个地方获得元数据这个元数据的发源地就是类型库事实上今天所有的组件都有一个类型库
这里为了说明如何产生元数据信息我们不妨以Microsoft Agent组件为例进行说明这个组件类似于Office的小助手它能够完成各种丰富多彩的人性化的动作并且支持语音识别和语音合成一般的操作系统 都默认安装了这个组件用户该不会发愁没有这个组件吧如果你的系统删除了这个组件你可以到去下载下面开始介绍如何在中使用非托管COM组件
首先是创建元数据
Microsoft Agent控件默认是安装在%systemroot%\msagent\目录下首先运行开始菜单中Visual StudioNET Command Prompt(命令提示)菜单项在这个目录执行下面的命令
tlbimp agentctldll /out: agentctl_proxydll
通过这个命令我们可以创建一个包含元数据信息的代理文件agentctl_proxydll注意这并不是一个真正的动态连接库文件而是一个装配文件(Assembly)也就是我们非托管COM组件的代理
也可以通过NET框架提供的实用程序aximpexe创建命令行如下这样它会生成两个文件如下图所示注意AgentObjectsdll 和agentctl_proxydll文件是完全一样的文件
C:\Program Files\Microsoft Visual Studio \VC>aximp %systemroot%\msagent\agentctldll
)thisstylewidth=; border=>
安装到中
把元数据文件安装到 环境中有两种办法
一是把文件复制到应用程序的BIN目录
二是把它复制到目录
第二种方法有一个缺陷你必须在每一个使用组件的页面插入一个@Assembly语句而保存到Bin目录则可以避免这一点assembly将会被加载到应用程序的所有页面因此我们最好还是把它放在bin目录
IL反汇编(Disassembler)
现在基本上到了令大多数VB或VBScript程序员头疼的时候了我们要利用一个反汇编器产生一些重要信息
Assembly 的名称空间(使用 @Import 语句)
精确的类名(这可能与ASP有着很大的不同!)
方法和属性的数据类型
方法和属性的精确拼写注意在 C# 中 Bodytext 和 BodyText是两个完全不同的变量
产生上述信息需要使用IL (Intermediate Language) Disassembler中间语言反汇编器你可以在生成元数据后键入ildasmexe启动该工具然后可以利用 File | Open选择相应的文件显示的结果如下图所示显示的结果非常类似于OLE/COM查看器获得结果
image height= alt=显示的结果 src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
注意生成的汇编文件不一样名称空间的名称也不一样在页面往往需要使用 @Import 导入名称空间不过它们的类属性方法都是一样的对于程序员来说整个蓝色的符号都是很重要的因为它们表示的是一个类或者是一个接口如果我们对这些类或者接口进行展开我们会获得一系列属性和方法的列表
我们看到的所有方法都有一个精确的数据类型描述首先是方法名称