在 C# 中编组非托管数组 - 省略大小参数

Marshalling Unmanaged Arrays in C# - omit size Parameter

我正在努力解决以下设计问题:

有一个 C 函数

void Foo(uint8_t *data, uint32_t length);

我想在 C# 中使用。所以我创建了委托:

public delegate void Foo_Fcn([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]byte[] data, UInt32 length);
public Foo_Fcn Foo;

所以,这里的(我承认:实际上是次要的)问题是:我必须在我的 C# 代码中传递第二个参数:

byte[] data = /*...*/;
Foo(data, (UInt32)data.Length);

这似乎有点多余,我更愿意打电话给

byte[] data = /*...*/;
Foo(data);

这是否可以通过任何方式实现(不使用 'proxy function')?如果是:如何?

不幸的是,没有办法自动执行此操作。

您最好的选择(在我看来)是将 C 函数包装在 .NET class 中,从而在内部隐藏这些细节。这也可以更轻松地处理将来对外部 API 的更改,甚至可能完全更改它,而无需更改其余代码。