在处理本机代码互操作性时,我决定是时候学习和尝试 C# 语言的新 Span 功能了。
尽管进行了多次试验,一切都进展顺利,直到我到达我的很长函数的最后阶段,我在下面插入了一个最小的可重现示例:
[DllImport(dll, SetLastError = true)]
internal static extern void GetNativeData(out byte lpBuffer, int size, out bytesRead);
ReadOnlySpan<T> ReadArray<T>(ReadOnlySpan<byte> buf, int Length) where T : unmanaged
{
var size = Length * Unsafe.SizeOf<T>();
if (buf.Length < size)
buf = new byte[size];
GetNativeData(out MemoryMarshal.GetReference(buf), size, out int read));
Dh.CreateError(ReadMemoryErr);
return MemoryMarshal.Cast<byte, T>(buf.Slice(0, size));
}
static IEnumerable<MyClass> GetResult()
{
// Here I allocate a buffer
Span<byte> buf = new byte[1000];
// After a long serie of calls to …Run Code Online (Sandbox Code Playgroud)