C#与vb6 com组件的互相调用方法[转]

COM(Component Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。

COM的优点?1.可代替原来的旧的 2.可重用行 3.简化分布式网络应用程序

现在讲下用c#开发com,在.net支持的语言里可以直接调用,但在其他语言就不同了(vb6)。主要有2种方法:

第一种:

1.首先在vs2005中,新建项目选择c#项目->类库

编写一下代码

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace csLib2

{

[ClassInterface(ClassInterfaceType.AutoDispatch)] //注意这行,这行是关键

public class Class1

{

public int add(int a, int b)

{

return (a + b);

}

public string mergeString(string a, string b)

{

return (a + b);

}

}

}

2.在文件AssemblyInfo.cs中,设置[assembly: ComVisible(true)],默认是false的,需要设置成true

3.选择项目属性,在生成标签卡中,勾选为com互操作注册.

4.生成项目dll文件。

5。注册:在运行命令窗口中输入cmd,打开命令窗口,然后输入cd /d+dll文件所在的路径(主要是为了注册省下输入全路径名称),用regasm命令注册

regasm csLib2.dll /tlb: csLib2.tlb.这里要注意,需要在环境变量中加入regasm.exe的路径名称,否则会提示regasm无效

这里说下 AutoDispatch,AutoDual,None三种类型的区别AutoDispatch和None为后期绑定,不会出现版本控制问题,而AutoDual会出现版本问题,极力不推荐。

用这三种类型生成的dll,然后在vb6引用时区别很明显,在vb6中打开object browser中就可以看到,AutoDual的dll所有方法都可以看到,而AutoDispatch缺只能看到一个空的类.

6.vb调用。用createobject调用

dim k as object

set k = createobject("csLib2.class1")

debug.print k.add(1,2)

用AutoDispatch,AutoDual生成的dll,也可以在vb6中先引用然后再调用

dim k as csLib2.class1

set k = new csLib2.class1

debug.print k.add(1,2)

但是用None生成的则只能用createobject生成

第二种方法

1.首先在vs2005中,新建项目选择c#项目->类库

编写一下代码

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace ClassLibrary1

{

[ComVisible(true)]

[Guid("D0A1C848-74F3-4234-81B6-B6D739A4C8C7")]

public interface IMyClass

{

string ShowCSharp();

}

[ComVisible(true)]

[Guid("84EE5A00-B434-4B86-959D-3388AB92AD4F")]

[ProgId("ClassLibrary1.MyClass")]

public class MyClass

{

public string ShowCSharp()

{

return "This is C#";

}

}

}

2.在文件AssemblyInfo.cs中,设置[assembly: ComVisible(true)],默认是false的,需要设置成true

3.选择项目属性,在生成标签卡中,勾选为com互操作注册.

4.生成项目dll文件。

Guid在工具->创建Guid生成,格式选择第四种,点复制之后需要把两边的{}除掉.

5.注册.regasm ClassLibrary1.dll /tlb:ClassLibrary1.tlb

6.在vb6 中引用ClassLibrary1.tlb文件,注意不是ClassLibrary1.dll文件

引用的话,在vb6编写时可以看到ClassLibrary1的类的方法。

dim k as Myclass

set k = new myclass

debug.print k.ShowCSharp

用vb6生成dll文件在c#访问方法:方法很简单 看例子

1.打开vb6工程,选择Activex dll工程,生成了一个空类

2.编写代码;

简单起见写一个函数

Public Function PutStr() As String

PutStr = "this is from vb6"

End Function

3.编译生成vbcom.dll文件

4.打开c#工程,添加vbcom.dll引用

5.调用

Project1.Class1 b = new Project1.Class1();

Console.WriteLine(b.PutStr());

运行后则会输出this is from vb6

是不是非常简单?