在ASP.NET中使用非托管COM组件

asp.net|托管

    众所周知,ASP.net是基于通用语言运行库创建的,也就是所谓的托管执行环境。生成的代码称为托管代码。编译器能够从源代码的描述中产生元数据信息,而运行库又从元数据中获得托管代码的信息。而我们编写的组件一般是在非托管环境下创建的,这些组件往往不包含元数据信息,那么我们怎么在托管代码中使用这些元数据信息呢? 
   
   为了在托管环境中使用非托管代码,我们首先必须手工为这些现有的组件产生元数据信息 。必须有一种工具能够产生元数据。能够从某个地方获得元数据。这个元数据的发源地就是类型库,事实上,今天所有的组件都有一个类型库。 
   
   这里为了说明如何产生元数据信息,我们不妨以Microsoft Agent组件为例进行说明。这个组件类似于Office的小助手,它能够完成各种丰富多彩的人性化的动作,并且支持语音识别和语音合成。一般的操作系统都默认安装了这个组件,用户该不会发愁没有这个组件吧。如果你的系统删除了这个组件,你可以到http://microsoft.com/msagent/downloads.htm.去下载。 
   
   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文件是完全一样的文件。 
   
   aximp %systemroot%\msagent\agentctl.dll 
   
  <p align=center><htmChina:Image id=Image1|1></htmChina></p>
    
    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查看器获得结果。
  [htmChina:ImageAlign align=center][htmChina:Image id=Image1|2][/htmChina:Image][/htmChina:ImageAlign][htmChina:ImageAlign align=center][htmChina:Image id=Image1|3][/htmChina:Image][/htmChina:ImageAlign]
    注意生成的汇编文件不一样,名称空间的名称也不一样,在ASP.NET页面往往需要使用 @Import 导入名称空间,不过它们的类、属性、方法都是一样的。对于ASP.net程序员来说,整个蓝色的符号都是很重要的,因为它们表示的是一个类或者是一个接口。如果我们对这些类或者接口进行展开,我们会获得一系列属性和方法的列表。 
   
    我们看到的所有方法都有一个精确的数据类型描述。首先是方法名称,冒号后面是返回值类型圆括号中是方法需要的参数。 
   
   当我们谈及用get_ 和set_方法描述属性的时候,VBScript程序员可能会一头雾水,我们知道每一个属性实际上是对应于类中的一个私有成员,属性的读写分别是通过这两个函数实现的。
  [htmChina:ImageAlign align=center][htmChina:Image id=Image1|4][/htmChina:Image][/htmChina:ImageAlign] 
   
    每一个属性旁边都有一个红色的标记,双击这个属性,我们可以获得属性的定义,我们可以看到属性可以为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组件中,通过组件调用间接实现。

时间: 2025-01-21 16:02:10

在ASP.NET中使用非托管COM组件的相关文章

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

众所周知,asp.net是基于通用语言运行库创建的,也就是所谓的托管执行环境.生成的代码称为托管代码.编译器能够从源代码的描述中产生元数据信息,而运行库又从元数据中获得托管代码的信息.而我们编写的组件一般是在非托管环境下创建的,这些组件往往不包含元数据信息,那么我们怎么在托管代码中使用这些元数据信息呢? 为了在托管环境中使用非托管代码,我们首先必须手工为这些现有的组件产生元数据信息.必须有一种工具能够产生元数据.能够从某个地方获得元数据.这个元数据的发源地就是类型库,事实上,今天所有的组件都有一

wpf win32-WPF中嵌入非托管exe无法响应mousemove和mousewheel消息

问题描述 WPF中嵌入非托管exe无法响应mousemove和mousewheel消息 RT,我在WPF中用HwndHost将非托管exe嵌入到border控件里,但嵌入后的exe无法通过Win32 Api改变样式,且无法响应MouseMove和MouseWheel消息

asp.net中如何安装配置jmail组件,能详细点最好。。

问题描述 asp.net中如何安装配置jmail组件,能详细点最好..刚入门...请大家多多关照.在此谢谢大家了 解决方案 解决方案二:1.安装jmail2.找到jmail.dll3.tlbimp.exejmail.dll/out:myJmail.dll/namespace:myJmail4.添加对jmail.dll的引用.解决方案三:4.添加对myJmail.dll的引用.解决方案四:1.运行安装程序;2.把jmail.dll复制到项目bin目录下面3.代码:解决方案五:感谢了,解决方案六:引

求助,asp.net中,js调com组件出现不支持属性或方法

问题描述 现在需要在js中调用C#的dll,查询网上的资料后说需要编写com组件,于是先写了个简单的com组件做测试,但是asp.net中的js调用时一直报错"对象不支持属性或方法"代码是这样的接口:[ComVisible(true)][Guid("2CBD3D76-35F1-4f9d-9C1B-9DBFEE412F76")]publicinterfaceIHello{stringShowHello();}接口的实现[ComVisible(true)][Guid(&

怎样在ASP程序中打印Access报表(无组件的经典程序)

access|程序|打印|无组件 目前,B/S模式(浏览器/服务器模式)成为企业网上首选的计算模式.由于B/S模式的特殊性,在C/S下相对较易实现的Excel报表打印功能在B/S下却成为一个难点.本人通过研究写了一个基于ASP程序的打印Acess报表的程序.本程序的特点是无须任何组件. Print.asp------------------------------------------------ <html><title>打印Excel报表</title><%

asp.net中uploadify文件上传组件的使用

这个控件有很多参数控制,以及事件的处理响应,相对来说也比较好用.参数控制可以控制上传文件多选.文件类型.文件大小.文件数量.检查文件是否存在,以及一些按钮参数的控制,如文字.高度.宽度等,对提交文件成功与否.完成操作.取消.停止上传等等都有控制,他们的帮助文档也写得比较完善,不过就是各个版本的方法参数完全不同了,但控件是一个好控件. 控件的使用首先要加入必备的脚本类库,由于该控件是利用了Jquery的功能,因此还需要应用Jquery脚本文件,如下所示. jquery-1.8.0.min.js"

调用非托管dll常出现的bug及解决办法

C和C++有很多好的类库的沉淀,在.NET中,完全抛弃它们而重头再来是非常不明智的.也是不现实的,所以,我们经常需要通过Pinvoke来使用以前遗留下来的非托管的dll.就.NET中使用非托管的dll经验而言,经常碰到的问题至少有两个,它们都是通过在运行时抛出异常来体现的. 1.试图加载格式不正确的程序 出现这种异常,通常是.NET应用程序的"目标平台"与非托管dll的平台不一样. 一般,在使用VS开发.NET的应用程序和类库时,默认的目标平台为"Any CPU",

C# 托管内存与非托管内存之间的转换(结合Unity3d的实际开发)

1.c#的托管代码和非托管代码 c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存,然而c#毕竟运行在c++之上,有的时候,(比如可能我们需要引入一些第三方的c++或native代码的库,在Unity3d开发中很常见)我们需要直接在c#中操纵非托管的代码,这些non-managed memory我们就需要自己去处理他们的申请和释放了, c# 中提供

C#调用非托管DLL,窗口关闭后报错,求教!

问题描述 这几天在做一个医院的报销接口系统,对方提供的接口是一个DLL动态库,暂且叫做A.DLL,是delphi的.其中A.DLL中封装的各功能方法,我都能正常调用,也都执行正常,但是唯一一点不足的就是,有的时候我关闭浏览器(我们的系统是BS)的时候,就会弹出下面的那个错误提示:无效的窗口句柄.以前做此类报销接口的时候其他厂商也很多是非托管DLL,但是没有出现过此类情况.百度了很长时间,有的说资源释放问题,有的说是A.DLL自身没有做好处理,各种各样的方案吧.然后自己又写了一个CS的Demo来测