众所周知,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的代码:

<% @Page Language="C#" %>

<% @Import Namespace="AgentObjects" %>

<% AxAgentObjects.AxAgent AxAgent=new AxAgentObjects.AxAgent();

IAgentCtlCharacterEx Character;

AxAgent.Characters.Load("Genie",(object)"GENIE.ACS");

Character = AxAgent.Characters["Genie"];

Character.LanguageID = 0x409;

// Display the character. Character.Show(null);

Character.Speak(“Hello World”, null);

Response.Write(Character.Name);

Character.Play("Wave");

Character.Play("Hide");

%>

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

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

ASP.NET应用技巧:非托管COM组件的使用的更多相关文章

  1. 关于Dll、Com组件、托管dll和非托管dll

    转自:https://blog.csdn.net/black_bad1993/article/details/53906252 Com组件 1.线程模型是干嘛用的?解决"多个线程" ...

  2. Office开发必备知识----为什么要释放非托管Com资源

    https://www.cnblogs.com/Charltsing/p/RealeaseComObject.html QQ:564955427 目前,国内Office插件开发的风头正盛,很多VBAe ...

  3. ASP.NET与非托管DLL的那些事儿【转+增】

    https://www.cnblogs.com/yeahgis/archive/2011/11/12/2246341.html ASP.NET与非托管DLL的那些事儿 环境VS2010 语言:ISO ...

  4. [.net 面向对象程序设计进阶] (8) 托管与非托管

    本节导读:虽然在.NET编程过程中,绝大多数内存垃圾回收由CLR(公共语言运行时)自动回收,但也有很多需要我们编码回收.掌握托管与非托管的基本知识,可以有效避免某些情况下导致的程序异常. 1.什么是托 ...

  5. [转] Asp.net vNext webapi 自托管

    [声明]本文转自:http://www.cnblogs.com/ListenCode/p/4206204.html 转载需注明! 微软推出的Asp.net vNext(asp.net 5.0)的其中的 ...

  6. C# using 三种使用方式 C#中托管与非托管 C#托管资源和非托管资源区别

    1.using指令.using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. ...

  7. C# 托管资源和非托管资源

    托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...

  8. (转)C#调用非托管Win 32 DLL

    转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...

  9. 斗地主你什么时候才会托管?(.NET中的托管于非托管)

    文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用“提示”(托管 ...

随机推荐

  1. Android TextView中图文混排设置行间距导致高度不一致问题解决

    最近项目中需要实现一个评论带表情的功能,刚开始一切顺利,非常easy,突然有一天发现文字跟表情混排的时候,TextView中图文高度不一致,excuse...什么鬼,之前明明测试过图文混排,不存在这个 ...

  2. Alpha冲刺——day9

    Alpha冲刺--day9 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...

  3. Linux命令(十四) 查看工作目录文件 ls

    目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 ls 命令是 Linux 下最常用的命令. ls 就是 list 的缩写.默认情况下 ls 命令用来打印出当前目录的清单, 如果 ...

  4. String js删除字符串的最后一个字符三种方法

    字符串 var basic = "abc,def,ghi,"; 第一种 basic = basic.substr(0, basic.length - 1); 第二种 basic = ...

  5. java8新特性(三)_Optional类的使用

    说实话,我第一次知道这个东西是从阿里规约中,因为公司前一段时间一直在搞代码审核,我的代码写的就感觉很烂,就像规范下.让别人看起来没那么烂.于是就开始看阿里规约,在看到NPE处理的时候,上面提到用Opt ...

  6. window.open() & iframe

    window.open() & iframe https://www.w3schools.com/jsref/met_win_open.asp window.open(URL, name, s ...

  7. 一本通1641【例 1】矩阵 A×B

    1641: [例 1]矩阵 A×B sol:矩阵乘法模板.三个for循环 #include <bits/stdc++.h> using namespace std; typedef lon ...

  8. 在c语言中嵌入汇编语句,对于我来说相当难。

    今天早上在csdn论坛上看到一个帖子http://topic.csdn.net/u/20120917/14/82f42e17-977a-4824-95bd-7b79db15d283.html:“C语言 ...

  9. 界面编程之QT的线程20180731

    /*******************************************************************************************/ 一.为什么需 ...

  10. 界面编程之QT的事件20180727

    /*******************************************************************************************/ 一.事件 1 ...