新鲜、有趣,互联生活。令狐葱。

2006/12/29

C#实现.net组件和COM组件的互操作

.net 框架自微软推出以来受到了很高的评价,但是无论如何,以前的东西诸如COM还是没办法完全丢弃的。本文试图通过两个小的例子,来测试一下.net组件和COM组件是如何相互调用和操作的,由于例子比较简单,估计会遗漏不少知识点。
 
COM组件中调用.net编写的组件
 
首先使用C#写一个组件(其实就是实现一个DLL),代码如下(保存为hello.cs):
using System;
using System.Collections.Generic;
using System.Text;

namespace Hello
{
    public class Hello
    {
        public void sayHello()
        {
             System.Console.WriteLine("Hello World!");
        }
    }
}
 
在命令行中执行
C:\>csc /t:library /out:Hello.dll hello.cs
即可生成一个dll库文件 Hello.dll。但是想要在现有的COM组件中使用这个组件,还需要进行如下操作:
C:\>regasm hello.dll /regfile hello.reg
上面的命令行是注册我们的.NET组件,并且产生了一个备用的注册表文件。其实就相当于在win9x/NT/2000下面注册COM组件使用的命令regsvr32 c:\test.dll 。在.NET下面,注册.NET组件的命令是regasm,注意,这个方法仅仅是为了可供COM组件来调用,.NET本身之间相互调用组件是不需要任何注册。
下面需要产生一个.NET组件的类型库,目的是为了我们在COM组件中进行提前绑定操作:
C:\>tlbexp hello.dll /out:hello.tlb
 
接下来就可以在自己的基于目前COM技术的代码中使用上面我们使用C#编写的.NET组件了。在这里,我们使用VB6.0编写一个小小的测试代码,在开始之前我们需要在VB的集成环境中使用菜单中的"引用"选项,选择我们刚才产生的类型库文件Hello.tlb。

VB代码如下:
Private Sub Form_Load()
Dim test As New Hello.hello
Dim str As String

str = test.sayHello()
MsgBox str
End Sub
 
.NET组件中使用目前存在的COM组件
 
对于.NET来讲,使用COM组件就要简单一些。..NET提供了大量的类库来方便的实现同COM的相互操作,其中很重要的一个名称空间就是:System.Runtime.InteropServices。通过这个名称空间的名字我们也可以从字面上看出,"互操作服务"。System.Runtime.InteropServices这个名称空间提供了一系列的类来对COM对象进行操作。

下面的例子中,我们来调用一下系统自带的Win32函数MessageBoxA, 这个函数位于系统的COM组件user32.dll当中,我们调用的代码如下:

using System;
using System.Runtime.InteropServices;

class Test
{
    [DllImport ("user32.dll")]
    public static extern int MessageBoxA( int hWnd,string strMsg,string strCaption, int nType);

    public static void Main()
    {
        int myMsg;
        myMsg =MessageBoxA(0,"Hello!" ,"test",0);
    }
}
 
切换到命令行,运行:
C:\>csc Test.cs
编译完毕我们的C#应用程序之后,直接运行就可以看到对话框了!同样的,也可以使用这种方法来调用我们自己使用VB/VC编写的COM组件。

需要注意的是,在调用COM组件之前,我们需要在.NET程序中引用名称空间:System.Runtime.InteropServices 。因为我们需要使用这个名称空间所提供的一个方法:DllImport。

没有评论: