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的代码:
<% @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组件的使用的更多相关文章
- 关于Dll、Com组件、托管dll和非托管dll
转自:https://blog.csdn.net/black_bad1993/article/details/53906252 Com组件 1.线程模型是干嘛用的?解决"多个线程" ...
- Office开发必备知识----为什么要释放非托管Com资源
https://www.cnblogs.com/Charltsing/p/RealeaseComObject.html QQ:564955427 目前,国内Office插件开发的风头正盛,很多VBAe ...
- ASP.NET与非托管DLL的那些事儿【转+增】
https://www.cnblogs.com/yeahgis/archive/2011/11/12/2246341.html ASP.NET与非托管DLL的那些事儿 环境VS2010 语言:ISO ...
- [.net 面向对象程序设计进阶] (8) 托管与非托管
本节导读:虽然在.NET编程过程中,绝大多数内存垃圾回收由CLR(公共语言运行时)自动回收,但也有很多需要我们编码回收.掌握托管与非托管的基本知识,可以有效避免某些情况下导致的程序异常. 1.什么是托 ...
- [转] Asp.net vNext webapi 自托管
[声明]本文转自:http://www.cnblogs.com/ListenCode/p/4206204.html 转载需注明! 微软推出的Asp.net vNext(asp.net 5.0)的其中的 ...
- C# using 三种使用方式 C#中托管与非托管 C#托管资源和非托管资源区别
1.using指令.using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到. ...
- C# 托管资源和非托管资源
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...
- (转)C#调用非托管Win 32 DLL
转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...
- 斗地主你什么时候才会托管?(.NET中的托管于非托管)
文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用“提示”(托管 ...
随机推荐
- Android TextView中图文混排设置行间距导致高度不一致问题解决
最近项目中需要实现一个评论带表情的功能,刚开始一切顺利,非常easy,突然有一天发现文字跟表情混排的时候,TextView中图文高度不一致,excuse...什么鬼,之前明明测试过图文混排,不存在这个 ...
- Alpha冲刺——day9
Alpha冲刺--day9 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...
- Linux命令(十四) 查看工作目录文件 ls
目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 ls 命令是 Linux 下最常用的命令. ls 就是 list 的缩写.默认情况下 ls 命令用来打印出当前目录的清单, 如果 ...
- String js删除字符串的最后一个字符三种方法
字符串 var basic = "abc,def,ghi,"; 第一种 basic = basic.substr(0, basic.length - 1); 第二种 basic = ...
- java8新特性(三)_Optional类的使用
说实话,我第一次知道这个东西是从阿里规约中,因为公司前一段时间一直在搞代码审核,我的代码写的就感觉很烂,就像规范下.让别人看起来没那么烂.于是就开始看阿里规约,在看到NPE处理的时候,上面提到用Opt ...
- window.open() & iframe
window.open() & iframe https://www.w3schools.com/jsref/met_win_open.asp window.open(URL, name, s ...
- 一本通1641【例 1】矩阵 A×B
1641: [例 1]矩阵 A×B sol:矩阵乘法模板.三个for循环 #include <bits/stdc++.h> using namespace std; typedef lon ...
- 在c语言中嵌入汇编语句,对于我来说相当难。
今天早上在csdn论坛上看到一个帖子http://topic.csdn.net/u/20120917/14/82f42e17-977a-4824-95bd-7b79db15d283.html:“C语言 ...
- 界面编程之QT的线程20180731
/*******************************************************************************************/ 一.为什么需 ...
- 界面编程之QT的事件20180727
/*******************************************************************************************/ 一.事件 1 ...