最近正在用C#编写一个管理程序,由于用到了MFC编写的一个控件,我必须通过C ++.NET封装了该类,将其写入一个UserControl,然后通过C#调用这个UserControl。其中涉及到几个函数,比较典型的一个在MFC中(标准C++中的引用表示方式)的函数表示如下:
bool GetCurItem(int &startHour, int &startMin,int &endHour,int &nEndMin, CString &strText, COLORREF &crBackground)
作用是返回控件中当前项目(Item)的一些信息,在MFC中通过在函数声明中使用“&”限制参数表示引用,可以通过参数返回有关的值,通过C++.NET(CLR)封装必须是如下的方式:
bool GetCurItem( int %nBegHour,int %nBegMin,int %nEndHour,int %nEndMin, String ^%strText, COLORREF %crBackground)
C++在托管的代码中使用“%”表示按引用传递参数。当然,如果上面的这个函数中将除了strText参数之外的其他参数前的“%”符号修改为“&”编译也可以通过,但是C#却不能够正常调用了。
在C#中对应的函数的表示方式是:
bool GetCurItem( ref int nBegHour,ref int nBegMin,ref int nEndHour,ref int nEndMin, ref String strText, ref uint crBackground)
在C#中,通过在函数参数之前(确切的说,应该是在数据类型之前)添加ref关键字表示一个引用。
在VB.NET中,同样函数的表示如下
Private Function GetCurItem(ByRef nBegHour As Integer, ByRef nBegMin As Integer, ByRef nEndHour As Integer, ByRef nEndMin As Integer, ByRef strText As String, ByRef crBackground As Long) As Boolean
在VB.NET中,直接在函数参数的前面添加byref关键字,表示按引用传递。
说明
1)由于C ++可以同时支持本地代码和托管代码,因此,引用的表示方式也有两种,一种是本地代码的表示方式,一种是托管代码的表示方式,VB和C#各有一种。
2)C++中托管和非托管混合编程时,特别注意不要将&和%混淆,这两个符号在编译时都没有问题,如果希望函数被其他托管代码调用,使用%,如果被C++非托管代码调用,则使用&。
3)在具有按引用传递参数的函数中,函数的调用方式各种语言也不尽相同,例如,C++和VB中,都是将变量直接作为参数传递给GetCurItem函数即可,但是在C#中,每个参数的前面必须写上ref,例如C#调用GetCurItem函数的方式如下:
GetCurItem(ref nBegHour, ref nBegMin, ref nEndHour, ref nEndMin, ref sText, ref nColor);