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).
}
在这里,您需要小心并手动检查空字符