有时候我们为了调用系统底层的API,为UI(C#)提供服务,那么要以把这些方法放在托管工程中(CLR),这样既可以调用API,又可以供.NET上层使用,这的确是一个很好的方法,CLR工程就像是一个桥梁,连接C++与.NET?
但有时候会有这么一个问题:在托管工程中的方法,如何声明输出参数?
举个例子:
有这样一个函数:
GetTimeStampFormat_r(UINT &FontSize,
CString &FontName,
COLORREF &FontColor,
UINT &Xpos,
UINT &Ypos,
BOOL &SolidBack,
COLORREF &BackColor)
在托管C++可以写成:
GetTimeStampFormat_r(UInt32& fontSize,
String^& fontName,
Color& fontColor,
UInt32& Xpos,
UInt32& Ypos,
bool& solidBack,
Color& backColor)
但是,从metadata中可以看到的函数原型是:
uint* fontSize,
string* fontName,
Color* fontColor,
uint* Xpos,
uint* Ypos,
bool* solidBack,
Color* backColor)
这显然不是我们希望的,因为要尽可能在C#这一层去用不安全代码,如指针。那么要如何定义出一个类似C#的ref的托管C++函数呢?
方法如下:
GetTimeStampFormat_r(unsigned% fontSize,
String^% fontName,
Color% fontColor,
unsigned% Xpos,
unsigned% Ypos,
bool% solidBack,
Color% backcolor)
在C#这边看到的原形就是:
GetTimeStampFormat_r(ref uint fontSize,
ref string fontName,
ref Color fontColor,
ref uint Xpos,
ref uint Ypos,
ref bool solidBack,
ref Color backColor)
关键是:%