避免在本机到托管回调上进行字符串分配

时间:2014-03-11 14:48:39

标签: c# c++ .net interop managed

我有一个本机库,它通过回调将硬件数据传递给托管代码 基本的本地管理管道由

完成
[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

感谢您的帮助 谢谢!

1 个答案:

答案 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).


    }

在这里你需要谨慎并手动检查空字符。