我们有一个c#应用程序,它使用回调方法从c ++项目接收数据:
/* c# code */
call[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private unsafe delegate void NewFrame(string serial, Int32* width, Int32* height, short* frame);
在我们的C ++项目中(从相机接收数据),我们非常频繁地调用这个'NewFrame'回调方法,将相机帧传递给c#代码。
c ++中此方法的定义是:
/* c++ code */
typedef void (__stdcall * NewFrame)(char* serialnumber, INT32* width,INT32* height, int16_t* frame);
要传递'serial',将c ++字符串对象转换为c ++代码中的char *:
/* c++ code */
char* stringToCsharpString(string s){
char* cserial = new char[s.length() + 1];
strcpy(cserial, s.c_str());
return cserial;
}
但是,这会导致(堆)内存泄漏,因为cserial对象未被释放。
这就是在c ++中调用这个NewFrame方法的方法:
/* c++ code */
newFrame(stringToCsharpString(node.getSerialNumber()), &w, &h, data.frame);
我们可以做些什么来解决这个问题?我们精通c#,但在c ++中根本没有。所以在谈论c ++代码时,请详细解释:)
答案 0 :(得分:0)
为了在C#中将C ++非托管内存转换为托管内存,您可以使用 gcnew :
String^ ConvertUnmanagedString2ManagedString(char* cserial)
{
return gcnew String(cserial)
}
在这里,我假设你的cserial内容编码是UCS-2 ofcourse。我不知道cserial的内容是什么,但如果它是用UTF8或UCS-2以外的其他编码编码的,你还需要应用文本编码转换,因为C#String编码是UCS-2。