我有一个本机库,它通过回调将硬件数据传递给托管代码 基本的本地管理管道由
完成[DllImport("Library.dll")]
public static extern bool Init(IntPtr dataCallBack)
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void Data(string data);
...
var handler = Marshal.GetFunctionPointerForDelegate(HandleData);
Init(handler);
...
private static void HandleData(string data)
{
//use data
}
上述工作正常。
但是,因为HandleData可以每秒调用数百甚至数千次(取决于确切的硬件模块)并且数据字符串也可能很长,所以它会对GC产生明显的压力。
我想避免创建所有这些字符串,而是接收数据为char []或甚至byte [],因为我只需要提取几个字段。
我试图用StringBuilder或char []替换'string',但这不起作用。
补充信息:
- 本机库将数据传递为char *(以null结尾的字符串)
- 内存代码分配和释放内存
- .NET版本:4.5
感谢您的帮助 谢谢!
答案 0 :(得分:1)
您是否尝试过像这样更改回调签名?
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void Data(IntPtr data);
private unsafe static void HandleData(IntPtr data)
{
byte* charPtr = (byte*)data;
// work with bytes here (which are single-byte chars).
}
在这里你需要谨慎并手动检查空字符。