一个简单的例子实现VB6中访问C# dll中的方法、属性以及事件。
C# DLL
1) 要使得C# dll中的方法、属性以及事件在VB6中暴露出来,以便写代码方便,需要加入相应的接口
- 方法和属性的接口,本例中为IComInterOpClass
[Guid(
"
12A7D9AE-B42F-4a91-9EEE-5E0951A552E2
"
)] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public
interface
IComInterOpClass {
//
Method
string
SayHello();
//
Property
string
Name {
get
;
set
; } }
- 事件的接口,本例中为IComInterOpEvent
[Guid(
"
868FD423-2504-4f5c-AB47-9F2B7DB8ED2C
"
)] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public
interface
IComInterOpEvent {
void
EventTest(
string
msg); }
2) 实现部分,注意事件的接口不需要继承,它是以Attribute的方式加入的。本例中的事件是用timer实现5秒钟触发一次。
namespace
ComInterOpLibrary {
public
delegate
void
EventTestHandler(
string
message); [Guid(
"
BA6DF62E-D59E-4e46-B2E6-F1CD990A1E18
"
)] [ClassInterface(ClassInterfaceType.None)] [ComSourceInterfacesAttribute(
"
ComInterOpLibrary.IComInterOpEvent
"
)] [ProgId(
"
ComInterOpClass
"
)]
public
class
ComInterOpClass : IComInterOpClass {
private
Timer myTimer
=
null
;
//
Event
public
event
EventTestHandler EventTest;
//
Property
public
string
Name {
get
;
set
; }
public
ComInterOpClass() { myTimer
=
new
Timer(
5000
); myTimer.AutoReset
=
true
; myTimer.Enabled
=
true
; myTimer.Elapsed
+=
new
ElapsedEventHandler(myTimer_Elapsed); }
void
myTimer_Elapsed(
object
sender,ElapsedEventArgs e) {
if
(EventTest
!=
null
) { EventTest(
"
Good day!
"
); } }
#region
IComInterOpClass Members
//
Method
public
string
SayHello() {
return
"
Hello
"
+
Name; }
#endregion
} }
3) 至此,C# dll部分就完成了,最后记得将项目的Register for COM InterOp选上。
VB部分
1) 首先声明两个变量,一个是类的,一个是事件的。
Public
obj
As
ComInterOpLibrary.ComInterOpClass
Public
WithEvents
objEvent
As
ComInterOpLibrary.ComInterOpClass '定义事件
2) 然后进行初始化,本例是放在Form Load的时候进行的。
Private
Sub
Form_Load()
Set
obj
=
New
ComInterOpLibrary.ComInterOpClass
Set
objEvent
=
obj
End Sub
3) 调用属性和方法
Dim
ret
As
String
"
Call property
obj.Name
=
txtName.Text
"
Call Method
ret
=
obj.SayHello() lblShow.Caption
=
ret
4) 访问事件
Private
Sub
objEvent_EventTest(
ByVal
msg
As
String
)
"
Call event
List1.AddItem msg
End Sub
以上代码摘自:http://www.sunnybtoc.com/page/M0/S228/228420.html
注意:方法的名称 _前面的objEvent就是程序开始部分定义的 public WithEvents 的变量名称,_后面EnevtTest就是事件的名称。
所有COM的事件都可以这样调用。
其实如果是控件的话,在VB代码编辑上方的左下拉列表里,选择该COM控件,右边的下拉框里会显示出该控件所有的事件。