gpt4 book ai didi

c# - 避免在 native 到托管回调上分配字符串

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:28 24 4
gpt4 key购买 nike

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

[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[] 替换“字符串”,但这没有用。

附加信息:
- native 库将数据作为 char *(空终止字符串)
- 内存由本地代码分配和释放
- .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).


}

这里需要注意,手动检查空字符。

关于c# - 避免在 native 到托管回调上分配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22329221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com