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

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

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


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