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

C# 避免在本机到托管回调上分配字符串,c#,c++,.net,interop,managed,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.GetFunct

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

[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

非常感谢您的帮助。

谢谢大家!

您是否尝试过这样更改回调签名

[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).


    }
在这里,您需要小心并手动检查空字符