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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 115 ::
收藏到网摘: 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 事件必须在事件接口中定义。