COM和.NET的互操作

前端之家收集整理的这篇文章主要介绍了COM和.NET的互操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

.NET Framework的产生已经有两年多的时间了,有不少公司开始采用.NET开发应用软件。但是很多公司在多年的项目应用中,开发了很多COM、DCOM组件,现在采用.NET开发组件,使这些组件成为了遗留代码。由于在开发COM组件时投入了大量的人力、财力,如何在.NET环境下重用这些COM组件就显得更有意义,本文将介绍使这些COM组件“起死回生”的方法。 @H_403_1@  @H_403_1@  .NET支持运行时通过COM、COM+、本地WinAPI调用与未管制代码的双向互操作性,BCL为此提供了一套类和属性包括受管制对象生存期的精确控制等。要实现互操作性,必须首先引入.NET Framework的 System.Runtime.InteropServices命名空间。C#的语法为: @H_403_1@  @H_403_1@  using System.Runtime.InteropServices; @H_403_1@  @H_403_1@  而VB.NET的语法为: @H_403_1@  @H_403_1@  import System.Runtime.InteropServices @H_403_1@  @H_403_1@  .NET访问API @H_403_1@  @H_403_1@  .NET允许C#访问未管制的DLL的函数。如要调用Windows User32.dll的MessageBox函数: @H_403_1@  @H_403_1@  int MessageBox(HWND hwnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType) @H_403_1@  @H_403_1@  可以声明一个具有DLLImport属性的static extern方法: @H_403_1@  @H_403_1@  using System.Runtime.InteropServices; 中国网管联盟www、bitsCN、com @H_403_1@  @H_403_1@  [DllImport(“user32.dll”)] @H_403_1@  @H_403_1@  static ertern int MessageBox(int hwnd,string text,string caption,int type); @H_403_1@  @H_403_1@  然后在代码里面直接调用就可以了。这里要注意在调用返回字符串的API中使用StringBuilder对象。 @H_403_1@  @H_403_1@  .NET访问COM组件 @H_403_1@  @H_403_1@  从.NET调用COM组件比较容易,只要使用tlbimp.exe产生COM的装配形式的WarpClass,然后在.NET项目中调用即可。 @H_403_1@  @H_403_1@  注意COM的类型信息通过Type Library文件描述,.NET装配件是自描述的。Tlbimp的作用是从COM组件及其类型信息中产生自描述的装配件。由于VB是进行COM组件开发最简单的语言,所以我们以一个简单的VB COM组件来说明。 @H_403_1@  @H_403_1@  1.编写VB组件 @H_403_1@  @H_403_1@  VB组件原码(文件名CoAccount.cls)如下: @H_403_1@  @H_403_1@  Private m_Balance As Integer @H_403_1@  @H_403_1@  ’组件的私有成员变量 @H_403_1@  @H_403_1@  Public Sub Deposit(sum As Integer) @H_403_1@  @H_403_1@  ’存钱的方法 @H_403_1@  @H_403_1@  m_Balance = m_Balance + sum @H_403_1@  @H_403_1@  End Sub @H_403_1@  @H_403_1@  Public Property Get Balance() As Integer @H_403_1@  @H_403_1@  ’属性Balance访问成员变量m_Balance

网管网bitsCN.com

@H_403_1@  @H_403_1@  Balance = m_Balance @H_403_1@  @H_403_1@  End Property @H_403_1@  @H_403_1@  将上述代码编译生成CoAccount.dll。 @H_403_1@  @H_403_1@  2. 产生.NET可访问的包装类(assembly),使用TlbImp.exe产生.NET装配件。 @H_403_1@  @H_403_1@  TlbImp /out:NetAccount.dll CoAccount.dll @H_403_1@  @H_403_1@  3.在.NET代码中访问 @H_403_1@  @H_403_1@  .NET代码只需引用CoAccount.dll,就可以像访问.NET的装配件一样访问COM组件。 @H_403_1@  @H_403_1@  将.NET组件转化为COM组件 @H_403_1@  @H_403_1@  因为.NET装配件开发效率较高,先在.NET环境下开发装配件,然后转化为COM组件,由VB、ASP等调用,可以加快开发进度。下面我们用一个例子简单阐述一下整个过程。步骤如下: @H_403_1@  @H_403_1@  1.定义接口 @H_403_1@  @H_403_1@  COM是通过抛出接口让外部应用调用的,每个接口、组件都有一个GUID,在.NET中开发COM组件也不例外。 @H_403_1@  @H_403_1@  [Guid(“18E2BCAF-F4B5-4031-8F84-FCFB1DC04877”)] //接口GUID @H_403_1@  @H_403_1@  public interface IAccount @H_403_1@  @H_403_1@  //定义接口IAccount @H_403_1@  @H_403_1@  { [DispId(1)] @H_403_1@  @H_403_1@  //每个方法属性都具有DISPID属性,是为了让VBScript等脚本语言调用 @H_403_1@  @H_403_1@  void deposit(int num); 中国网管联盟www.bitscn.com @H_403_1@  @H_403_1@  //方法,实现存钱的功能 @H_403_1@  @H_403_1@  [DispId(2)] @H_403_1@  @H_403_1@  int Balance @H_403_1@  @H_403_1@  //属性,查看当前的账户余额,只读。请注意.NET下属性的定义方法 @H_403_1@  @H_403_1@  { get; } @H_403_1@  @H_403_1@  } @H_403_1@  @H_403_1@  2.实现接口的派生类 @H_403_1@  @H_403_1@  [Guid(“9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E”),//组件的GUID @H_403_1@  @H_403_1@  ClassInterface(ClassInterfaceType.None)] @H_403_1@  @H_403_1@  //指明组件的调用方式,支持后期绑定 @H_403_1@  @H_403_1@  public class NetAccount:IAccount @H_403_1@  @H_403_1@  //实现接口派生类,注意派生类要实现接口的所有方法。 @H_403_1@  @H_403_1@  { private int balance; @H_403_1@  @H_403_1@  //组件的私有成员变量(在.NET中称为域(FIELD)) @H_403_1@  @H_403_1@  public NetAccount() @H_403_1@  @H_403_1@  //构造函数,初始化成员变量 @H_403_1@  @H_403_1@  { balance=10; } @H_403_1@  @H_403_1@  public void deposit(int num) @H_403_1@  @H_403_1@  //实现存钱方法。 @H_403_1@  @H_403_1@  { balance+=num; } @H_403_1@  @H_403_1@  public int Balance @H_403_1@  @H_403_1@  //实现Balance属性,通过它访问成员变量 @H_403_1@  @H_403_1@  { get @H_403_1@  @H_403_1@  { return balance; }

Feedom.net

@H_403_1@  @H_403_1@  } @H_403_1@  @H_403_1@  } @H_403_1@  @H_403_1@  3.将.NET私有装配件转化成公有装配件 @H_403_1@  @H_403_1@  .NET下对装配件的调用,实际上是拷贝到调用应用程序的本地目录,称为私有装配件。要转化为COM组件,首先要转化为公有装配件,也就是放到GAC里。 @H_403_1@  @H_403_1@  (1) 创建强名字 @H_403_1@  @H_403_1@  为了使COM对象能够被外部对象调用,类库组合必须有一个强名字。创建强名字需要用到SN.EXE,语法为:sn -k account.snk,然后将强名字拷贝到debug目录下。打开AssemblyInfo.cs,并修改下面一行的内容: @H_403_1@  @H_403_1@  [assembly: AssemblyKeyFile(@“account.snk”)] @H_403_1@  @H_403_1@  (2) 将装配件转入GAC @H_403_1@  @H_403_1@  编译项目文件产生NetAccount.dll文件,使用GacUtil.exe装入GAC: @H_403_1@  @H_403_1@  gacutil -i NetAccount.dll @H_403_1@  @H_403_1@  (3) 注册装配件 @H_403_1@  @H_403_1@  在注册表里面注册装配件,允许COM组件的客户调用,也可以生成注册文件,以备将来调用。 @H_403_1@  @H_403_1@  RegAsm NETAccount.Dll @H_403_1@  @H_403_1@  执行上述语句,则装配件可以被脚本语言调用。 @H_403_1@  @H_403_1@  (4) 导出类型库 @H_403_1@  @H_403_1@  为了可以在VB里面使用组件,必须使用tlbexp.Exe导出COM类型库。

网管联盟www.bitsCN.com

    Tlbexp /out:NetAccount.tlb NetAccount.dll     经过上面的工作,就将一个.NET装配件转化为COM组件。需要注意的是:在COM中调用.NET对象需要具备以下条件:     ● 类必须是public性质;     ● 特性、方法和事件必须是public性质的;     ● 特性和方法必须在类接口中定义;     ● 事件必须在事件接口中定义。     

猜你在找的VB相关文章