一个简单的例子实现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
5) 运行界面
本文转自loose_went博客园博客,原文链接:http://www.cnblogs.com/michaelxu/archive/2010/03/30/1700445.html,如需转载请自行联系原作者