当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > Com与.Net互操作(二次业务开发及插件开发总结)

ASP.NET
Asp.net 时间操作基类(支持短日期,长日期,时间差)
asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)
asp.net 数据库备份还原(sqlserver+access)
Asp.Net 数据操作类(附通用数据基类)
Asp.net 弹出对话框基类(输出alet警告框)
Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)
Asp.net Socket客户端(远程发送和接收数据)
Asp.net 字符串操作基类(安全,替换,分解等)
Asp.Net数据输出到EXCEL表格中
asp.net Gridview里添加汇总行
asp.net UpdatePanel的简单用法
asp.net ajaxControlToolkit FilteredTextBoxExtender的简单用法
this connector is disabled错误的解决方法
sql事务应用积累
asp.net Page.Controls对象(找到所有服务器控件)
在asp.NET中字符串替换的五种方法
ASP.NET缓存方法分析和实践示例代码
asp.net 在DNN模块开发中遇到的resx怪问题
ASP.NET State service状态服务的问题解决方法
asp.net 结合mysql存储过程进行分页代码

ASP.NET 中的 Com与.Net互操作(二次业务开发及插件开发总结)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 255 ::
收藏到网摘: n/a

Com与.Net互操作一、.Net调用Com组件.Net调用Com组件主要分为两类:静态调用及动态调用。所谓静态调用:指通过通过tlbimp.exe命名产生Com组件在.Net环境下的包装类,然后通过这个包装类来访问Com组件。所谓动态调用:是指不通过Com组件的包装类来进行Com组件调用,而是在远行时通过反射来进行Com组件调用。下面将分别详细的讨论这两种实现方法:² 静态调用1、 编写Com组件MyComponent.dll2、 产生可访问Com组件的包装类:tlbimp /out:Interop.MyComponent.dll MyComponent.dll3、 在.Net代码中访问只要在项目添加Com包装类,就可以像访问.Net的装配件一样访问Com组件。 当然上面的三个步骤也可以在VS中直接添加对Com组件的引用,让VS自动完成第二步。注意:1、 如果引用Com组件的.Net项目为结果为强命名组件,这个时候要求Com组件的包装类也必须为强命名组件,所以这个时候必须手动进行第二步操作,并且在产生包装类的时候设置snk文件名称,具体操作方法为:tblimp/keyfile:filename.snk /out:Interop.MyComponent.dll MyComponent.dll2、 要想有更多的设置请参考tlbimp的使用方法。 ² 动态调用1、 编写Com组件MyComponent.dll。2、 在.Net程序中产生要被调用的Com组件类的Type:Type comType =Type.GetTypeFromCLSID( Guid ); 或Type comType =Type.GetTypeFromProgID( string );3、 生成Com组件类对象object comObj =Activator.CreateInstance( comType ); 或object comObj =comType.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public |BindingFlags.NonPublic | BindingFlags.Instance |BindingFlags.CreateInstance, null, null, args);4、 设置参数及其对应的ByRef属性。object[] args =new object[]{arg1, arg2 , …,argn};ParameterModifier[]modifiers = new ParameterModifier[1];modifiers[0] =new ParameterModifier( argNumCount );//设置参数是否为ByRefmodifiers[0][0]= true;//表示该参数是ByRef(InOut/Out)modifiers[0][n]= false;//表示该参数是ByValue(In)。 5、 调用Com组件方法或者属性。objectreturnValue = comType.InvokeMember( “MethodName” ,BindingFlags.InvokeMethod|… , null , comObj ,args ,modifiers ,null ); 注意:1、 调用Com组件方法的时候,不能够采用MethodInfo的方式进行调用,由于没有Com组件的源数据信息,不能通过Type.GetMethod等方法够获取与Com组件相关的任何特有类型信息。2、 动态调用Com组件方法中,如果需要参数回传值,则必须将该参数对应的ParameterModifier表示设置为True,即使该参数类型为传址类型。(在.net中如果参数为传址类类型,那么参数默认行为是ByRef的)。3、 如果传递给Com组件的参数设置为传引用的(ParameterModifier[n] =true)的时候,该参数的值不能够为空(Null),否则会产生一个TargetInvocationException异常。解决的方法为,如果参数为基本类型(传值)则产生一个默认的值,如果参数为非基本类型(传址)则使用new UnknownWrapper(null)进行替代该参数。二、Com调用.Net组件 具体步骤演示如下:1、 定义接口:Com是通过抛出接口让外部应用调用的,每个接口、组件都有一个Guid,在.Net中开发Com组件也不例外。[Guid(“0bb13346-7e9d-4aba-9ff2-862e0105489a”)]public interface IMyService{//定义接口方法或者属性//每个方法都有一个DISPID属性,供VBScript等使用 [DispId( 1 )] void Method1( args … );}2、 实现接口的派生类 //guid属性定义组件的Guid //ProgID定义Com组件的ProgID [Guid("ba0a3019-f0d8-4406-8116-f80d5515c686" ) , ProgId("ClassNamespace.MyService"), ClassInterface(ClassInterfaceType.None)] public classMyService : IMyService { …… //实现代码部分 }3、 将.Net装配件转换为公有装配件。(1)、创建强名字 sn –k MyService.snk 并将强名字拷贝到工程目录下面 在AssembyInfo.cs修改对应的配置 [assembly: AssemblyKeyFile(@“../../MyService.snk”)](2)、注册装配件 RegAsm /codebase MyService.dll注意:/codebase是指设置注册表中的基本代码,也就是记录下dll的路径,供ccw在Com客户端在任何位置都可以找到该dll,如果没有/codebase属性,则ccw默认为dll与Com客户端执行程序的当前目录下面。 (3)、将装配件加入GAC gacutil-i MyService.dll 注意:该步骤不是必须的。 (4)、导出类型库 为了在VB中使用,必须使用tlbexp.exe导出Com类型库。 tlbexp/out:MyService.tlb MyService.dll 经过上面的工作,就将一个.NET装配件转化为COM组件。 注意: 在Com中调用的.Net对象必须具有下面的特性:l 类必须是public性质; l 特性、方法和事件必须是public性质的; l 特性和方法必须在类接口中定义; l 事件必须在事件接口中定义。