ASP.NET技巧:非托管COM组件的使用

开发 后端
本文介绍了如何在asp.net中使用非托管COM组件的步骤。我们编写的组件一般是在非托管环境下创建的,这些组件往往不包含元数据信息。

众所周知,asp.net是基于通用语言运行库创建的,也就是所谓的托管执行环境。生成的代码称为托管代码。编译器能够从源代码的描述中产生元数据信息,而运行库又从元数据中获得托管代码的信息。而我们编写的组件一般是在非托管环境下创建的,这些组件往往不包含元数据信息,那么我们怎么在托管代码中使用这些元数据信息呢?

为了在托管环境中使用非托管代码,我们首先必须手工为这些现有的组件产生元数据信息。必须有一种工具能够产生元数据。能够从某个地方获得元数据。这个元数据的发源地就是类型库,事实上,今天所有的组件都有一个类型库。

这里为了说明如何产生元数据信息,我们不妨以Microsoft Agent组件为例进行说明。这个组件类似于Office的小助手,它能够完成各种丰富多彩的人性化的动作,并且支持语音识别和语音合成。一般的操作系统 都默认安装了这个组件,用户该不会发愁没有这个组件吧。如果你的系统删除了这个组件,你可以到http://microsoft.com/msagent/downloads.htm去下载。下面开始介绍如何在asp.net中使用非托管COM组件。

1、首先是创建元数据

Microsoft Agent控件默认是安装在%systemroot%\msagent\目录下,首先运行开始菜单中Visual Studio.NET Command Prompt(命令提示)菜单项。在这个目录执行下面的命令。

    tlbimp agentctl.dll /out: agentctl_proxy.dll

通过这个命令我们可以创建一个包含元数据信息的代理文件agentctl_proxy.dll。注意这并不是一个真正的动态连接库文件,而是一个装配文件(Assembly),也就是我们非托管COM组件的代理。

也可以通过.NET框架提供的实用程序aximp.exe创建,命令行如下,这样它会生成两个文件,如下图所示:注意AgentObjects.dll 和agentctl_proxy.dll文件是完全一样的文件。

C:\Program Files\Microsoft Visual Studio 9.0\VC>aximp %systemroot%\msagent\agentctl.dll

命令行如下,这样它会生成两个文件, 

2、安装到asp.net中

把元数据文件安装到asp.net 环境中有两种办法:

一是把文件复制到应用程序的BIN目录。

二是把它复制到asp.net目录。

第二种方法有一个缺陷,你必须在每一个使用组件的asp.net页面插入一个@Assembly语句。而保存到Bin目录则可以避免这一点。assembly将会被加载到应用程序的所有asp.net页面。因此我们最好还是把它放在bin目录。

3、IL反汇编(Disassembler)

现在基本上到了令大多数VB或VBScript程序员头疼的时候了,我们要利用一个反汇编器产生一些重要信息。

Assembly 的名称空间(使用 @Import 语句)

精确的类名(这可能与ASP有着很大的不同!)

方法和属性的数据类型

方法和属性的精确拼写。注意在 C# 中 Bodytext 和 BodyText是两个完全不同的变量。

产生上述信息需要使用IL (Intermediate Language) Disassembler中间语言反汇编器,你可以在生成元数据后,键入ildasm.exe启动该工具。然后可以利用 File | Open,选择相应的文件,显示的结果如下图所示,显示的结果非常类似于OLE/COM查看器获得结果。

显示的结果 

注意生成的汇编文件不一样,名称空间的名称也不一样,在asp.net页面往往需要使用 @Import 导入名称空间,不过它们的类、属性、方法都是一样的。对于asp.net程序员来说,整个蓝色的符号都是很重要的,因为它们表示的是一个类或者是一个接口。如果我们对这些类或者接口进行展开,我们会获得一系列属性和方法的列表。

我们看到的所有方法都有一个精确的数据类型描述。首先是方法名称,冒号后面是返回值类型圆括号中是方法需要的参数。

当我们谈及用get_ 和set_方法描述属性的时候,VBScript程序员可能会一头雾水,我们知道每一个属性实际上是对应于类中的一个私有成员,属性的读写分别是通过这两个函数实现的。

属性的读写分别是通过这两个函数实现的 

每一个属性旁边都有一个红色的标记,双击这个属性,我们可以获得属性的定义,我们可以看到属性可以为Get, Set 或者 Get/Set。

4、组件的使用

当我们对元数据了解清楚以后,剩下的工作就是如何在asp.net 中使用这个组件,下面是一段使用MsAgent的代码:

  1. <% @Page Language="C#" %>   
  2. <% @Import Namespace="AgentObjects" %>   
  3. <%   
  4. AxAgentObjects.AxAgent AxAgent=new AxAgentObjects.AxAgent();   
  5. IAgentCtlCharacterEx Character;   
  6. AxAgent.Characters.Load("Genie",(object"GENIE.ACS");   
  7. Character = AxAgent.Characters["Genie"];   
  8. Character.LanguageID = 0x409;   
  9. // Display the character.   
  10. Character.Show(null);   
  11. Character.Speak(“Hello World”, null);   
  12. Response.Write(Character.Name);   
  13. Character.Play("Wave");   
  14. Character.Play("Hide");   
  15. %>  
  16.  

当导入类型库以后,接着我们要创建这个类的实例,剩下的使用方法基本上和ASP应用组件差不多。

所有的COM组件调用的方法基本上相同,正如在托管应用程序(C#、Visual Basic.NET)加入一个COM组件引用,接着系统要为这些非托管代码生成一个封装,实际上也是执行上面的步骤,即导入类型库。实际上这种方法可以用 于所有的托管应用程序中,包括托管的C++代码、C#、Visual Basic.NET环境,.NET 框架的这种互操作性保护了组件开发者的既有投资,而且为我们的托管程序设计提供了一条思路。即我们可以把许多使用托管代码难以实现或者实现起来非常麻烦的 功能(比如通过API函数调用读写软盘硬盘物理扇区)封装到一个非托管COM组件中,通过组件调用间接实现。

【编辑推荐】

  1. ASP.NET中使用AJAX中的方式
  2. ASP.NET中WCF服务与ASMX服务的兼容性
  3. ASP.NET中using的用法三则
  4. ASP.NET表单介绍
  5. ASP.NET中Get和Post的用法

责任编辑:book05 来源: cnblogs
相关推荐

2009-07-29 13:32:06

ASP.NET控件使用

2009-07-29 13:42:25

ASP.NET注释

2009-07-29 13:12:36

StringBuildASP.NET技巧

2009-07-24 12:14:17

asp.net技巧

2009-08-10 13:32:15

ASP.NET TimASP.NET组件设计

2009-01-03 09:34:30

ASP.NET.NET性能优化

2009-12-18 16:10:40

新建Asp.Net

2009-07-27 17:15:51

URL RewriteASP.NET

2009-08-05 16:53:14

ASP.NET组件设计

2009-08-10 10:19:47

ASP.NET组件设计

2009-08-10 14:08:15

ASP.NET服务器控ASP.NET组件设计

2009-07-31 13:06:53

CheckBoxLisASP.NET页面

2018-02-23 13:55:16

ASP.NET性能优化技巧

2009-08-10 16:07:44

ASP.NET Lin

2009-08-10 15:42:33

ASP.NET Che

2009-07-29 14:12:45

ASP.NET tra

2009-07-24 15:35:00

ASP.NET Gri

2009-12-23 13:42:08

ASP.NET事务

2011-06-28 14:30:48

Asp.net

2011-07-06 11:15:09

ASP.NET
点赞
收藏

51CTO技术栈公众号